Skip to content

Commit

Permalink
[Ada] Hotfix/ada model sort (#7491)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
michelealbano authored and wing328 committed Jan 28, 2018
1 parent d1933b5 commit 3035bc6
Show file tree
Hide file tree
Showing 6 changed files with 158 additions and 182 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -459,32 +459,6 @@ public Map<String, Object> postProcessOperations(Map<String, Object> 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
public Map<String, Object> postProcessModels(Map<String, Object> objs) {
// Collect the model dependencies.
Expand All @@ -509,53 +483,55 @@ public Map<String, Object> postProcessModels(Map<String, Object> objs) {
}
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<String, List<String>> deps = modelDepends;
Collections.sort(orderedModels, new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> lhs, Map<String, Object> rhs) {
Object v = lhs.get("model");
String lhsName = ((CodegenModel) v).classname;
v = rhs.get("model");
String rhsName = ((CodegenModel) v).classname;
List<String> lhsList = deps.get(lhsName);
List<String> rhsList = deps.get(rhsName);
if (dependsOn(lhsName, rhsName)) {
// LOGGER.info("Type " + lhsName + " depends on " + rhsName);
return 1;
}
if (dependsOn(rhsName, lhsName)) {
// LOGGER.info("Type " + rhsName + " depends on " + lhsName);
return -1;
}
// Put models without dependencies first.
if (lhsList == null) {
// LOGGER.info(" Empty " + lhsName + ", no check " + 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<Map<String, Object>> revisedOrderedModels = new ArrayList<Map<String, Object>>();
List<String> collectedModelNames = new ArrayList<String>();
int sizeOrderedModels = orderedModels.size();
for (int i=0;i<sizeOrderedModels;i++) {
Map<String, Object> independentModel = null;
String independentModelName = null;
for (Map<String, Object> 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 (rhsList == null) {
// LOGGER.info(" No check " + lhsName + ", empty " + rhsName);
return 1;
if (!dependent) {
// this model was independent
independentModel = model;
independentModelName = modelName;
}
// Sort models on their name.
// LOGGER.info("Compare " + lhsName + "<" + rhsName);
return lhsName.compareTo(rhsName);
}
});
/* for (Map<String, Object> 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);
}

Expand Down
2 changes: 1 addition & 1 deletion samples/client/petstore/ada/.swagger-codegen/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.3.1
2.4.0-SNAPSHOT
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
-- OpenAPI spec version: 1.0.0
-- Contact: [email protected]
--
-- 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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
-- OpenAPI spec version: 1.0.0
-- Contact: [email protected]
--
-- 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;
Expand Down
Loading

0 comments on commit 3035bc6

Please sign in to comment.