diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractAdaCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractAdaCodegen.java index 3f433abebdc..5e75454d396 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractAdaCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractAdaCodegen.java @@ -459,32 +459,6 @@ abstract public class AbstractAdaCodegen extends DefaultCodegen implements Codeg return objs; } - /** - * Check if type1 depends on type2 recursively. - * - * @param type1 first model type name - * @param type2 second model type name - * @return true if type1 depends on type2 - */ - private Boolean dependsOn(String type1, String type2) { - final String fullTypeName = modelPackage + ".Models." + type2; - if (type1.equals(type2) || type1.equals(fullTypeName)) { - return true; - } - final List lhsList = modelDepends.get(type1); - if (lhsList != null) { - for (final String S : lhsList) { - if (S.equals(type2) || S.equals(fullTypeName)) { - return true; - } - if (dependsOn(S, type2)) { - return true; - } - } - } - return false; - } - @Override public Map postProcessModels(Map objs) { // Collect the model dependencies. @@ -509,53 +483,55 @@ abstract public class AbstractAdaCodegen extends DefaultCodegen implements Codeg } p.vendorExtensions.put("x-is-model-type", isModel); } - modelDepends.put(m.classname, d); + // let us work with fully qualified names only modelDepends.put(modelPackage + ".Models." + m.classname, d); orderedModels.add(model); } } - // Sort the models according to dependencies so that model that depend - // on others appear at end of the list. - final Map> deps = modelDepends; - Collections.sort(orderedModels, new Comparator>() { - @Override - public int compare(Map lhs, Map rhs) { - Object v = lhs.get("model"); - String lhsName = ((CodegenModel) v).classname; - v = rhs.get("model"); - String rhsName = ((CodegenModel) v).classname; - List lhsList = deps.get(lhsName); - List rhsList = deps.get(rhsName); - if (dependsOn(lhsName, rhsName)) { - // LOGGER.info("Type " + lhsName + " depends on " + rhsName); - return 1; + // Sort models using dependencies: + // List revisedOrderedModels <- () + // if you have N model, do N passes. In each pass look for an independent model + // cycle over orderedModels + // if I find a model that has no dependencies, or all of its dependencies are in revisedOrderedModels, consider it the independentModel + // put the independentModel at the end of revisedOrderedModels, and remove it from orderedModels + // + List> revisedOrderedModels = new ArrayList>(); + List collectedModelNames = new ArrayList(); + int sizeOrderedModels = orderedModels.size(); + for (int i=0;i independentModel = null; + String independentModelName = null; + for (Map model : orderedModels) { + // let us work with fully qualified names only + String modelName = modelPackage + ".Models." + ((CodegenModel) model.get("model")).classname; + boolean dependent = false; + for (String dependency : modelDepends.get(modelName)) { + if (!collectedModelNames.contains(dependency)) { + dependent = true; + } } - if (dependsOn(rhsName, lhsName)) { - // LOGGER.info("Type " + rhsName + " depends on " + lhsName); - return -1; + if (!dependent) { + // this model was independent + independentModel = model; + independentModelName = modelName; } - // Put models without dependencies first. - if (lhsList == null) { - // LOGGER.info(" Empty " + lhsName + ", no check " + rhsName); - return -1; - } - if (rhsList == null) { - // LOGGER.info(" No check " + lhsName + ", empty " + rhsName); - return 1; - } - // Sort models on their name. - // LOGGER.info("Compare " + lhsName + "<" + rhsName); - return lhsName.compareTo(rhsName); } - }); - /* for (Map model : orderedModels) { - Object v = model.get("model"); - if (v instanceof CodegenModel) { - CodegenModel m = (CodegenModel) v; - LOGGER.info("Order: " + m.name); + if (null != independentModel) { + // I have find an independentModel. Add it to revisedOrderedModels, and remove from orderedModels + revisedOrderedModels.add(independentModel); + collectedModelNames.add(independentModelName); + orderedModels.remove(independentModel); } - } */ + } + // bookkeeping: + // if I still have elements in orderedModels: + // if it's NOT last time I postProcessModels(), it means there are some dependencies that were not considered yet. That's not a problem + // if it's last iteration, there are circular dependencies. + // In any case, I add models still in orderedModels to revisedOrderedModels + revisedOrderedModels.addAll(orderedModels); + orderedModels = revisedOrderedModels; + return postProcessModelsEnum(objs); } diff --git a/samples/client/petstore/ada/.swagger-codegen/VERSION b/samples/client/petstore/ada/.swagger-codegen/VERSION index a6254504e40..855ff9501eb 100644 --- a/samples/client/petstore/ada/.swagger-codegen/VERSION +++ b/samples/client/petstore/ada/.swagger-codegen/VERSION @@ -1 +1 @@ -2.3.1 \ No newline at end of file +2.4.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/ada/src/client/samples-petstore-clients.adb b/samples/client/petstore/ada/src/client/samples-petstore-clients.adb index e1e43f722b7..312afcab926 100644 --- a/samples/client/petstore/ada/src/client/samples-petstore-clients.adb +++ b/samples/client/petstore/ada/src/client/samples-petstore-clients.adb @@ -4,7 +4,7 @@ -- OpenAPI spec version: 1.0.0 -- Contact: apiteam@swagger.io -- --- NOTE: This package is auto generated by the swagger code generator 2.3.1. +-- NOTE: This package is auto generated by the swagger code generator 2.4.0-SNAPSHOT. -- https://github.com/swagger-api/swagger-codegen.git -- Do not edit the class manually. with Swagger.Streams; diff --git a/samples/client/petstore/ada/src/client/samples-petstore-clients.ads b/samples/client/petstore/ada/src/client/samples-petstore-clients.ads index 2a944ec5233..590245fe2a3 100644 --- a/samples/client/petstore/ada/src/client/samples-petstore-clients.ads +++ b/samples/client/petstore/ada/src/client/samples-petstore-clients.ads @@ -4,7 +4,7 @@ -- OpenAPI spec version: 1.0.0 -- Contact: apiteam@swagger.io -- --- NOTE: This package is auto generated by the swagger code generator 2.3.1. +-- NOTE: This package is auto generated by the swagger code generator 2.4.0-SNAPSHOT. -- https://github.com/swagger-api/swagger-codegen.git -- Do not edit the class manually. with Samples.Petstore.Models; diff --git a/samples/client/petstore/ada/src/model/samples-petstore-models.adb b/samples/client/petstore/ada/src/model/samples-petstore-models.adb index d90738a55bc..9b310388c9d 100644 --- a/samples/client/petstore/ada/src/model/samples-petstore-models.adb +++ b/samples/client/petstore/ada/src/model/samples-petstore-models.adb @@ -4,7 +4,7 @@ -- OpenAPI spec version: 1.0.0 -- Contact: apiteam@swagger.io -- --- NOTE: This package is auto generated by the swagger code generator 2.3.1. +-- NOTE: This package is auto generated by the swagger code generator 2.4.0-SNAPSHOT. -- https://github.com/swagger-api/swagger-codegen.git -- Do not edit the class manually. @@ -64,110 +64,6 @@ package body Samples.Petstore.Models is - procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; - Name : in String; - Value : in Category_Type) is - begin - Into.Start_Entity (Name); - Serialize (Into, "id", Value.Id); - Into.Write_Entity ("name", Value.Name); - Into.End_Entity (Name); - end Serialize; - - procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; - Name : in String; - Value : in Category_Type_Vectors.Vector) is - begin - Into.Start_Array (Name); - for Item of Value loop - Serialize (Into, "", Item); - end loop; - Into.End_Array (Name); - end Serialize; - - procedure Deserialize (From : in Swagger.Value_Type; - Name : in String; - Value : out Category_Type) is - Object : Swagger.Value_Type; - begin - Swagger.Streams.Deserialize (From, Name, Object); - Swagger.Streams.Deserialize (Object, "id", Value.Id); - Swagger.Streams.Deserialize (Object, "name", Value.Name); - end Deserialize; - - procedure Deserialize (From : in Swagger.Value_Type; - Name : in String; - Value : out Category_Type_Vectors.Vector) is - List : Swagger.Value_Array_Type; - Item : Category_Type; - begin - Value.Clear; - Swagger.Streams.Deserialize (From, Name, List); - for Data of List loop - Deserialize (Data, "", Item); - Value.Append (Item); - end loop; - end Deserialize; - - - - - procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; - Name : in String; - Value : in Order_Type) is - begin - Into.Start_Entity (Name); - Serialize (Into, "id", Value.Id); - Serialize (Into, "petId", Value.Pet_Id); - Into.Write_Entity ("quantity", Value.Quantity); - Into.Write_Entity ("shipDate", Value.Ship_Date); - Into.Write_Entity ("status", Value.Status); - Into.Write_Entity ("complete", Value.Complete); - Into.End_Entity (Name); - end Serialize; - - procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; - Name : in String; - Value : in Order_Type_Vectors.Vector) is - begin - Into.Start_Array (Name); - for Item of Value loop - Serialize (Into, "", Item); - end loop; - Into.End_Array (Name); - end Serialize; - - procedure Deserialize (From : in Swagger.Value_Type; - Name : in String; - Value : out Order_Type) is - Object : Swagger.Value_Type; - begin - Swagger.Streams.Deserialize (From, Name, Object); - Swagger.Streams.Deserialize (Object, "id", Value.Id); - Swagger.Streams.Deserialize (Object, "petId", Value.Pet_Id); - Swagger.Streams.Deserialize (Object, "quantity", Value.Quantity); - Deserialize (Object, "shipDate", Value.Ship_Date); - Swagger.Streams.Deserialize (Object, "status", Value.Status); - Swagger.Streams.Deserialize (Object, "complete", Value.Complete); - end Deserialize; - - procedure Deserialize (From : in Swagger.Value_Type; - Name : in String; - Value : out Order_Type_Vectors.Vector) is - List : Swagger.Value_Array_Type; - Item : Order_Type; - begin - Value.Clear; - Swagger.Streams.Deserialize (From, Name, List); - for Data of List loop - Deserialize (Data, "", Item); - Value.Append (Item); - end loop; - end Deserialize; - - - - procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; Name : in String; Value : in Tag_Type) is @@ -216,6 +112,54 @@ package body Samples.Petstore.Models is + procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; + Name : in String; + Value : in Category_Type) is + begin + Into.Start_Entity (Name); + Serialize (Into, "id", Value.Id); + Into.Write_Entity ("name", Value.Name); + Into.End_Entity (Name); + end Serialize; + + procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; + Name : in String; + Value : in Category_Type_Vectors.Vector) is + begin + Into.Start_Array (Name); + for Item of Value loop + Serialize (Into, "", Item); + end loop; + Into.End_Array (Name); + end Serialize; + + procedure Deserialize (From : in Swagger.Value_Type; + Name : in String; + Value : out Category_Type) is + Object : Swagger.Value_Type; + begin + Swagger.Streams.Deserialize (From, Name, Object); + Swagger.Streams.Deserialize (Object, "id", Value.Id); + Swagger.Streams.Deserialize (Object, "name", Value.Name); + end Deserialize; + + procedure Deserialize (From : in Swagger.Value_Type; + Name : in String; + Value : out Category_Type_Vectors.Vector) is + List : Swagger.Value_Array_Type; + Item : Category_Type; + begin + Value.Clear; + Swagger.Streams.Deserialize (From, Name, List); + for Data of List loop + Deserialize (Data, "", Item); + Value.Append (Item); + end loop; + end Deserialize; + + + + procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; Name : in String; Value : in Pet_Type) is @@ -331,4 +275,60 @@ package body Samples.Petstore.Models is + + procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; + Name : in String; + Value : in Order_Type) is + begin + Into.Start_Entity (Name); + Serialize (Into, "id", Value.Id); + Serialize (Into, "petId", Value.Pet_Id); + Into.Write_Entity ("quantity", Value.Quantity); + Into.Write_Entity ("shipDate", Value.Ship_Date); + Into.Write_Entity ("status", Value.Status); + Into.Write_Entity ("complete", Value.Complete); + Into.End_Entity (Name); + end Serialize; + + procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; + Name : in String; + Value : in Order_Type_Vectors.Vector) is + begin + Into.Start_Array (Name); + for Item of Value loop + Serialize (Into, "", Item); + end loop; + Into.End_Array (Name); + end Serialize; + + procedure Deserialize (From : in Swagger.Value_Type; + Name : in String; + Value : out Order_Type) is + Object : Swagger.Value_Type; + begin + Swagger.Streams.Deserialize (From, Name, Object); + Swagger.Streams.Deserialize (Object, "id", Value.Id); + Swagger.Streams.Deserialize (Object, "petId", Value.Pet_Id); + Swagger.Streams.Deserialize (Object, "quantity", Value.Quantity); + Deserialize (Object, "shipDate", Value.Ship_Date); + Swagger.Streams.Deserialize (Object, "status", Value.Status); + Swagger.Streams.Deserialize (Object, "complete", Value.Complete); + end Deserialize; + + procedure Deserialize (From : in Swagger.Value_Type; + Name : in String; + Value : out Order_Type_Vectors.Vector) is + List : Swagger.Value_Array_Type; + Item : Order_Type; + begin + Value.Clear; + Swagger.Streams.Deserialize (From, Name, List); + for Data of List loop + Deserialize (Data, "", Item); + Value.Append (Item); + end loop; + end Deserialize; + + + end Samples.Petstore.Models; diff --git a/samples/client/petstore/ada/src/model/samples-petstore-models.ads b/samples/client/petstore/ada/src/model/samples-petstore-models.ads index 2b7f513d471..625071b3ebf 100644 --- a/samples/client/petstore/ada/src/model/samples-petstore-models.ads +++ b/samples/client/petstore/ada/src/model/samples-petstore-models.ads @@ -4,7 +4,7 @@ -- OpenAPI spec version: 1.0.0 -- Contact: apiteam@swagger.io -- --- NOTE: This package is auto generated by the swagger code generator 2.3.1. +-- NOTE: This package is auto generated by the swagger code generator 2.4.0-SNAPSHOT. -- https://github.com/swagger-api/swagger-codegen.git -- Do not edit the class manually. with Swagger.Streams; @@ -45,74 +45,6 @@ package Samples.Petstore.Models is - -- ------------------------------ - -- Pet category - -- A category for a pet - -- ------------------------------ - type Category_Type is - record - Id : Swagger.Nullable_Long; - Name : Swagger.Nullable_UString; - end record; - - package Category_Type_Vectors is - new Ada.Containers.Vectors (Index_Type => Positive, - Element_Type => Category_Type); - - procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; - Name : in String; - Value : in Category_Type); - - procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; - Name : in String; - Value : in Category_Type_Vectors.Vector); - - procedure Deserialize (From : in Swagger.Value_Type; - Name : in String; - Value : out Category_Type); - - procedure Deserialize (From : in Swagger.Value_Type; - Name : in String; - Value : out Category_Type_Vectors.Vector); - - - - -- ------------------------------ - -- Pet Order - -- An order for a pets from the pet store - -- ------------------------------ - type Order_Type is - record - Id : Swagger.Nullable_Long; - Pet_Id : Swagger.Nullable_Long; - Quantity : Swagger.Nullable_Integer; - Ship_Date : Swagger.Nullable_Date; - Status : Swagger.Nullable_UString; - Complete : Swagger.Nullable_Boolean; - end record; - - package Order_Type_Vectors is - new Ada.Containers.Vectors (Index_Type => Positive, - Element_Type => Order_Type); - - procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; - Name : in String; - Value : in Order_Type); - - procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; - Name : in String; - Value : in Order_Type_Vectors.Vector); - - procedure Deserialize (From : in Swagger.Value_Type; - Name : in String; - Value : out Order_Type); - - procedure Deserialize (From : in Swagger.Value_Type; - Name : in String; - Value : out Order_Type_Vectors.Vector); - - - -- ------------------------------ -- Pet Tag -- A tag for a pet @@ -145,6 +77,38 @@ package Samples.Petstore.Models is + -- ------------------------------ + -- Pet category + -- A category for a pet + -- ------------------------------ + type Category_Type is + record + Id : Swagger.Nullable_Long; + Name : Swagger.Nullable_UString; + end record; + + package Category_Type_Vectors is + new Ada.Containers.Vectors (Index_Type => Positive, + Element_Type => Category_Type); + + procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; + Name : in String; + Value : in Category_Type); + + procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; + Name : in String; + Value : in Category_Type_Vectors.Vector); + + procedure Deserialize (From : in Swagger.Value_Type; + Name : in String; + Value : out Category_Type); + + procedure Deserialize (From : in Swagger.Value_Type; + Name : in String; + Value : out Category_Type_Vectors.Vector); + + + -- ------------------------------ -- a Pet -- A pet for sale in the pet store @@ -219,4 +183,40 @@ package Samples.Petstore.Models is + -- ------------------------------ + -- Pet Order + -- An order for a pets from the pet store + -- ------------------------------ + type Order_Type is + record + Id : Swagger.Nullable_Long; + Pet_Id : Swagger.Nullable_Long; + Quantity : Swagger.Nullable_Integer; + Ship_Date : Swagger.Nullable_Date; + Status : Swagger.Nullable_UString; + Complete : Swagger.Nullable_Boolean; + end record; + + package Order_Type_Vectors is + new Ada.Containers.Vectors (Index_Type => Positive, + Element_Type => Order_Type); + + procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; + Name : in String; + Value : in Order_Type); + + procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class; + Name : in String; + Value : in Order_Type_Vectors.Vector); + + procedure Deserialize (From : in Swagger.Value_Type; + Name : in String; + Value : out Order_Type); + + procedure Deserialize (From : in Swagger.Value_Type; + Name : in String; + Value : out Order_Type_Vectors.Vector); + + + end Samples.Petstore.Models;