[Ada] Hotfix/ada model sort (#7491)

* Ada generator generates "=>" (correct syntax) instead of "->". Fixes #7450

* Updated the Ada petstore samples

* Committing "VERSION" file and the rest of the petstore samples

* Redone the algorithm to sort the models by their dependencies, to create correct *-model.ads files.

To fix #7485

* changed tabs into spaces
This commit is contained in:
micheleISEP 2018-01-28 06:48:51 +00:00 committed by William Cheng
parent d1933b5fca
commit 3035bc629b
6 changed files with 217 additions and 241 deletions

View File

@ -459,32 +459,6 @@ abstract public class AbstractAdaCodegen extends DefaultCodegen implements Codeg
return objs; 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<String> 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 @Override
public Map<String, Object> postProcessModels(Map<String, Object> objs) { public Map<String, Object> postProcessModels(Map<String, Object> objs) {
// Collect the model dependencies. // Collect the model dependencies.
@ -509,53 +483,55 @@ abstract public class AbstractAdaCodegen extends DefaultCodegen implements Codeg
} }
p.vendorExtensions.put("x-is-model-type", isModel); 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); modelDepends.put(modelPackage + ".Models." + m.classname, d);
orderedModels.add(model); orderedModels.add(model);
} }
} }
// Sort the models according to dependencies so that model that depend // Sort models using dependencies:
// on others appear at end of the list. // List revisedOrderedModels <- ()
final Map<String, List<String>> deps = modelDepends; // if you have N model, do N passes. In each pass look for an independent model
Collections.sort(orderedModels, new Comparator<Map<String, Object>>() { // cycle over orderedModels
@Override // if I find a model that has no dependencies, or all of its dependencies are in revisedOrderedModels, consider it the independentModel
public int compare(Map<String, Object> lhs, Map<String, Object> rhs) { // put the independentModel at the end of revisedOrderedModels, and remove it from orderedModels
Object v = lhs.get("model"); //
String lhsName = ((CodegenModel) v).classname; List<Map<String, Object>> revisedOrderedModels = new ArrayList<Map<String, Object>>();
v = rhs.get("model"); List<String> collectedModelNames = new ArrayList<String>();
String rhsName = ((CodegenModel) v).classname; int sizeOrderedModels = orderedModels.size();
List<String> lhsList = deps.get(lhsName); for (int i=0;i<sizeOrderedModels;i++) {
List<String> rhsList = deps.get(rhsName); Map<String, Object> independentModel = null;
if (dependsOn(lhsName, rhsName)) { String independentModelName = null;
// LOGGER.info("Type " + lhsName + " depends on " + rhsName); for (Map<String, Object> model : orderedModels) {
return 1; // 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)) { if (!dependent) {
// LOGGER.info("Type " + rhsName + " depends on " + lhsName); // this model was independent
return -1; 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);
} }
}); if (null != independentModel) {
/* for (Map<String, Object> model : orderedModels) { // I have find an independentModel. Add it to revisedOrderedModels, and remove from orderedModels
Object v = model.get("model"); revisedOrderedModels.add(independentModel);
if (v instanceof CodegenModel) { collectedModelNames.add(independentModelName);
CodegenModel m = (CodegenModel) v; orderedModels.remove(independentModel);
LOGGER.info("Order: " + m.name);
} }
} */ }
// 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); return postProcessModelsEnum(objs);
} }

View File

@ -1 +1 @@
2.3.1 2.4.0-SNAPSHOT

View File

@ -4,7 +4,7 @@
-- OpenAPI spec version: 1.0.0 -- OpenAPI spec version: 1.0.0
-- Contact: apiteam@swagger.io -- 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 -- https://github.com/swagger-api/swagger-codegen.git
-- Do not edit the class manually. -- Do not edit the class manually.
with Swagger.Streams; with Swagger.Streams;

View File

@ -4,7 +4,7 @@
-- OpenAPI spec version: 1.0.0 -- OpenAPI spec version: 1.0.0
-- Contact: apiteam@swagger.io -- 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 -- https://github.com/swagger-api/swagger-codegen.git
-- Do not edit the class manually. -- Do not edit the class manually.
with Samples.Petstore.Models; with Samples.Petstore.Models;

View File

@ -4,7 +4,7 @@
-- OpenAPI spec version: 1.0.0 -- OpenAPI spec version: 1.0.0
-- Contact: apiteam@swagger.io -- 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 -- https://github.com/swagger-api/swagger-codegen.git
-- Do not edit the class manually. -- 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; procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class;
Name : in String; Name : in String;
Value : in Tag_Type) is 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; procedure Serialize (Into : in out Swagger.Streams.Output_Stream'Class;
Name : in String; Name : in String;
Value : in Pet_Type) is 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; end Samples.Petstore.Models;

View File

@ -4,7 +4,7 @@
-- OpenAPI spec version: 1.0.0 -- OpenAPI spec version: 1.0.0
-- Contact: apiteam@swagger.io -- 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 -- https://github.com/swagger-api/swagger-codegen.git
-- Do not edit the class manually. -- Do not edit the class manually.
with Swagger.Streams; 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 -- Pet Tag
-- A tag for a pet -- 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
-- A pet for sale in the pet store -- 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; end Samples.Petstore.Models;