From 0a8fb1e5326c99cfabfe555f5c8050dad982a8ab Mon Sep 17 00:00:00 2001 From: russellb337 Date: Mon, 10 Aug 2015 13:50:52 -0700 Subject: [PATCH] codegen should honor path level parameters --- .../io/swagger/codegen/DefaultGenerator.java | 64 +++++++++++++------ 1 file changed, 44 insertions(+), 20 deletions(-) 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 0b6f677857a..0f1b2e87753 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 @@ -13,6 +13,7 @@ import io.swagger.models.Path; import io.swagger.models.Swagger; import io.swagger.models.auth.OAuth2Definition; import io.swagger.models.auth.SecuritySchemeDefinition; +import io.swagger.models.parameters.Parameter; import io.swagger.util.Json; import org.apache.commons.io.IOUtils; @@ -123,7 +124,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { Map definitions = swagger.getDefinitions(); if (definitions != null) { List sortedModelKeys = sortModelsByInheritance(definitions); - + for (String name : sortedModelKeys) { Model model = definitions.get(name); Map modelMap = new HashMap(); @@ -331,7 +332,7 @@ 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() { @@ -339,10 +340,10 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { 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) { @@ -351,30 +352,30 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { 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; } @@ -383,12 +384,12 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { for (String resourcePath : paths.keySet()) { Path path = paths.get(resourcePath); - processOperation(resourcePath, "get", path.getGet(), ops); - processOperation(resourcePath, "put", path.getPut(), ops); - processOperation(resourcePath, "post", path.getPost(), ops); - processOperation(resourcePath, "delete", path.getDelete(), ops); - processOperation(resourcePath, "patch", path.getPatch(), ops); - processOperation(resourcePath, "options", path.getOptions(), ops); + processOperation(resourcePath, "get", path.getGet(), ops, path); + processOperation(resourcePath, "put", path.getPut(), ops, path); + processOperation(resourcePath, "post", path.getPost(), ops, path); + processOperation(resourcePath, "delete", path.getDelete(), ops, path); + processOperation(resourcePath, "patch", path.getPatch(), ops, path); + processOperation(resourcePath, "options", path.getOptions(), ops, path); } return ops; } @@ -401,14 +402,33 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { return map.get(name); } - - public void processOperation(String resourcePath, String httpMethod, Operation operation, Map> operations) { + public void processOperation(String resourcePath, String httpMethod, Operation operation, Map> operations, Path path) { if (operation != null) { List tags = operation.getTags(); if (tags == null) { tags = new ArrayList(); tags.add("default"); } + + /* + build up a set of parameter "ids" defined at the operation level + per the swagger 2.0 spec "A unique parameter is defined by a combination of a name and location" + i'm assuming "location" == "in" + */ + Set operationParameters = new HashSet(); + if (operation.getParameters() != null) { + for (Parameter parameter : operation.getParameters()) { + operationParameters.add(generateParameterId(parameter)); + } + } + + //need to propagate path level down to the operation + for (Parameter parameter : path.getParameters()) { + //skip propagation if a parameter with the same name is already defined at the operation level + if (!operationParameters.contains(generateParameterId(parameter))) { + operation.addParameter(parameter); + } + } for (String tag : tags) { CodegenOperation co = config.fromOperation(resourcePath, httpMethod, operation, swagger.getDefinitions()); @@ -443,7 +463,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } authMethods.put(securityName, oauth2Operation); } else { - authMethods.put(securityName, securityDefinition); + authMethods.put(securityName, securityDefinition); } } } @@ -454,6 +474,10 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } } + private String generateParameterId(Parameter parameter) { + return parameter.getName() + ":" + parameter.getIn(); + } + protected String sanitizeTag(String tag) { // remove spaces and make strong case String[] parts = tag.split(" ");