From 3a0d0ad74191e836770606e1803e43742351127c Mon Sep 17 00:00:00 2001 From: rienafairefr <rienafairefr@gmail.com> Date: Wed, 13 Feb 2019 11:10:22 +0100 Subject: [PATCH 1/6] *Bundle classes for templating input instead of Map<String, Object> --- .gitignore | 1 + .../codegen/DefaultGenerator.java | 179 ++++++------ .../codegen/templating/ApiBundle.java | 248 ++++++++++++++++ .../codegen/templating/ApiInfoBundle.java | 20 ++ .../codegen/templating/BaseBundle.java | 17 ++ .../codegen/templating/Bundle.java | 12 + .../templating/CodegenOperationBundle.java | 44 +++ .../codegen/templating/ModelBundle.java | 29 ++ .../codegen/templating/ModelsBundle.java | 72 +++++ .../codegen/templating/OperationsBundle.java | 132 +++++++++ .../templating/TemplatingInputBundle.java | 266 ++++++++++++++++++ .../codegen/MockDefaultGenerator.java | 10 +- 12 files changed, 946 insertions(+), 84 deletions(-) create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiBundle.java create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiInfoBundle.java create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/BaseBundle.java create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/Bundle.java create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/CodegenOperationBundle.java create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/OperationsBundle.java create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java diff --git a/.gitignore b/.gitignore index d864b9076a3..5cd2860e36f 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ packages/ /target /generated-files +test-output/ nbactions.xml # scalatra diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index 34c5026f64f..3572543abd9 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -37,6 +37,14 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.config.GeneratorProperties; import org.openapitools.codegen.ignore.CodegenIgnoreProcessor; +//import org.openapitools.codegen.languages.AbstractJavaCodegen; +import org.openapitools.codegen.templating.ApiBundle; +import org.openapitools.codegen.templating.ApiInfoBundle; +import org.openapitools.codegen.templating.Bundle; +import org.openapitools.codegen.templating.ModelBundle; +import org.openapitools.codegen.templating.ModelsBundle; +import org.openapitools.codegen.templating.OperationsBundle; +import org.openapitools.codegen.templating.TemplatingInputBundle; import org.openapitools.codegen.utils.ImplementationVersion; import org.openapitools.codegen.utils.ModelUtils; import org.openapitools.codegen.utils.URLPathUtils; @@ -261,7 +269,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } } - private void generateModelTests(List<File> files, Map<String, Object> models, String modelName) throws IOException { + private void generateModelTests(List<File> files, ModelsBundle models, String modelName) throws IOException { // to generate model test files for (String templateName : config.modelTestTemplateFiles().keySet()) { String suffix = config.modelTestTemplateFiles().get(templateName); @@ -281,7 +289,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } } - private void generateModelDocumentation(List<File> files, Map<String, Object> models, String modelName) throws IOException { + private void generateModelDocumentation(List<File> files, ModelsBundle models, String modelName) throws IOException { for (String templateName : config.modelDocTemplateFiles().keySet()) { String docExtension = config.getDocExtension(); String suffix = docExtension != null ? docExtension : config.modelDocTemplateFiles().get(templateName); @@ -300,7 +308,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } } - private void generateModel(List<File> files, Map<String, Object> models, String modelName) throws IOException { + private void generateModel(List<File> files, ModelsBundle models, String modelName) throws IOException { for (String templateName : config.modelTemplateFiles().keySet()) { String suffix = config.modelTemplateFiles().get(templateName); String filename = config.modelFileFolder() + File.separator + config.toModelFilename(modelName) + suffix; @@ -318,7 +326,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } } - private void generateModels(List<File> files, List<Object> allModels, List<String> unusedModels) { + private void generateModels(List<File> files, List<ModelBundle> allModels, List<String> unusedModels) { if (!generateModels) { return; } @@ -347,7 +355,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } // store all processed models - Map<String, Object> allProcessedModels = new TreeMap<String, Object>(new Comparator<String>() { + Map<String, ModelsBundle> allProcessedModels = new TreeMap<String, ModelsBundle>(new Comparator<String>() { @Override public int compare(String o1, String o2) { return ObjectUtils.compare(config.toModelName(o1), config.toModelName(o2)); @@ -446,8 +454,8 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { Map<String, Schema> schemaMap = new HashMap<>(); schemaMap.put(name, schema); - Map<String, Object> models = processModels(config, schemaMap); - models.put("classname", config.toModelName(name)); + ModelsBundle models = processModels(config, schemaMap); + models.setClassname(config.toModelName(name)); models.putAll(config.additionalProperties()); allProcessedModels.put(name, models); } catch (Exception e) { @@ -456,15 +464,22 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } // loop through all models to update children models, isSelfReference, isCircularReference, etc - allProcessedModels = config.updateAllModels(allProcessedModels); + Map<String, Object> processed = new HashMap<String, Object>(allProcessedModels); + processed = config.updateAllModels(processed); // post process all processed models - allProcessedModels = config.postProcessAllModels(allProcessedModels); + processed = config.postProcessAllModels(processed); + + allProcessedModels = new HashMap<String, ModelsBundle>(); + for (Map.Entry<String, Object> entry: processed.entrySet()) { + allProcessedModels.put(entry.getKey(), new ModelsBundle((Map<String, Object>) entry.getValue())); + } // generate files based on processed models for (String modelName : allProcessedModels.keySet()) { - Map<String, Object> models = (Map<String, Object>) allProcessedModels.get(modelName); - models.put("modelPackage", config.modelPackage()); + ModelsBundle models = allProcessedModels.get(modelName); + models.setModelPackage(config.modelPackage()); + models.putAll(config.additionalProperties()); try { //don't generate models that have an import mapping if (config.importMapping().containsKey(modelName)) { @@ -472,10 +487,10 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } // TODO revise below as we've already performed unaliasing so that the isAlias check may be removed - Map<String, Object> modelTemplate = (Map<String, Object>) ((List<Object>) models.get("models")).get(0); + ModelBundle modelTemplate = models.getModels().get(0); // Special handling of aliases only applies to Java - if (modelTemplate != null && modelTemplate.containsKey("model")) { - CodegenModel m = (CodegenModel) modelTemplate.get("model"); + if (modelTemplate != null) { + CodegenModel m = modelTemplate.getModel(); if (m.isAlias) { continue; // Don't create user-defined classes for aliases } @@ -505,7 +520,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } - private void generateApis(List<File> files, List<Object> allOperations, List<Object> allModels) { + private void generateApis(List<File> files, List<ApiBundle> allOperations, List<ModelBundle> allModels) { if (!generateApis) { return; } @@ -533,19 +548,19 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { return ObjectUtils.compare(one.operationId, another.operationId); } }); - Map<String, Object> operation = processOperations(config, tag, ops, allModels); + ApiBundle operation = processOperations(config, tag, ops, allModels); URL url = URLPathUtils.getServerURL(openAPI); - operation.put("basePath", basePath); - operation.put("basePathWithoutHost", config.encodePath(url.getPath()).replaceAll("/$", "")); - operation.put("contextPath", contextPath); - operation.put("baseName", tag); - operation.put("apiPackage", config.apiPackage()); - operation.put("modelPackage", config.modelPackage()); + operation.setBasePath(basePath); + operation.setBasePathWithoutHost(config.encodePath(url.getPath()).replaceAll("/$", "")); + operation.setContextPath(contextPath); + operation.setBaseName(tag); + operation.setApiPackage(config.apiPackage()); + operation.setModelPackage(config.modelPackage()); operation.putAll(config.additionalProperties()); - operation.put("classname", config.toApiName(tag)); - operation.put("classVarName", config.toApiVarName(tag)); - operation.put("importPath", config.toApiImport(tag)); - operation.put("classFilename", config.toApiFilename(tag)); + operation.setClassname(config.toApiName(tag)); + operation.setClassVarName(config.toApiVarName(tag)); + operation.setImportPath(config.toApiImport(tag)); + operation.setClassFilename(config.toApiFilename(tag)); if (allModels == null || allModels.isEmpty()) { operation.put("hasModel", false); @@ -554,7 +569,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } if (!config.vendorExtensions().isEmpty()) { - operation.put("vendorExtensions", config.vendorExtensions()); + operation.setVendorExtensions(config.vendorExtensions()); } // process top-level x-group-parameters @@ -576,18 +591,18 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { if (this.config.additionalProperties().containsKey(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG)) { sortParamsByRequiredFlag = Boolean.valueOf(this.config.additionalProperties().get(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG).toString()); } - operation.put("sortParamsByRequiredFlag", sortParamsByRequiredFlag); + operation.setSortParamsByRequiredFlag(sortParamsByRequiredFlag); /* consumes, produces are no longer defined in OAS3.0 processMimeTypes(swagger.getConsumes(), operation, "consumes"); processMimeTypes(swagger.getProduces(), operation, "produces"); */ - allOperations.add(new HashMap<String, Object>(operation)); + allOperations.add(operation); for (int i = 0; i < allOperations.size(); i++) { - Map<String, Object> oo = (Map<String, Object>) allOperations.get(i); + ApiBundle oo = allOperations.get(i); if (i < (allOperations.size() - 1)) { - oo.put("hasMore", "true"); + oo.setHasMore(true); } } @@ -658,7 +673,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } - private void generateSupportingFiles(List<File> files, Map<String, Object> bundle) { + private void generateSupportingFiles(List<File> files, TemplatingInputBundle bundle) { if (!generateSupportingFiles) { return; } @@ -809,41 +824,43 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { return outputFile; } - private Map<String, Object> buildSupportFileBundle(List<Object> allOperations, List<Object> allModels) { + private TemplatingInputBundle buildSupportFileBundle(List<ApiBundle> allOperations, List<ModelBundle> allModels) { - Map<String, Object> bundle = new HashMap<String, Object>(); + TemplatingInputBundle bundle = new TemplatingInputBundle(); bundle.putAll(config.additionalProperties()); - bundle.put("apiPackage", config.apiPackage()); + bundle.setApiPackage(config.apiPackage()); - Map<String, Object> apis = new HashMap<String, Object>(); - apis.put("apis", allOperations); + ApiInfoBundle apis = new ApiInfoBundle(); + apis.setApis(allOperations); URL url = URLPathUtils.getServerURL(openAPI); - bundle.put("openAPI", openAPI); - bundle.put("basePath", basePath); - bundle.put("basePathWithoutHost", basePathWithoutHost); - bundle.put("scheme", URLPathUtils.getScheme(url, config)); - bundle.put("host", url.getHost()); - bundle.put("contextPath", contextPath); - bundle.put("apiInfo", apis); - bundle.put("models", allModels); - bundle.put("apiFolder", config.apiPackage().replace('.', File.separatorChar)); - bundle.put("modelPackage", config.modelPackage()); - - Map<String, SecurityScheme> securitySchemeMap = openAPI.getComponents() != null ? openAPI.getComponents().getSecuritySchemes() : null; + bundle.setOpenAPI(openAPI); + bundle.setBasePath(basePath); + bundle.setBasePathWithoutHost(basePathWithoutHost); + bundle.setScheme(URLPathUtils.getScheme(url, config)); + bundle.setHost(url.getHost()); + bundle.setContextPath(contextPath); + bundle.setApiInfo(apis); + bundle.setModels(allModels); + bundle.setApiFolder(config.apiPackage().replace('.', File.separatorChar)); + bundle.setModelPackage(config.modelPackage()); + + Map<String, SecurityScheme> securitySchemeMap = + openAPI.getComponents() != null ? openAPI.getComponents().getSecuritySchemes() : null; List<CodegenSecurity> authMethods = config.fromSecurity(securitySchemeMap); if (authMethods != null && !authMethods.isEmpty()) { - bundle.put("authMethods", authMethods); - bundle.put("hasAuthMethods", true); + bundle.setAuthMethods(authMethods); + bundle.setHasAuthMethods(true); if (hasOAuthMethods(authMethods)) { - bundle.put("hasOAuthMethods", true); - bundle.put("oauthMethods", getOAuthMethods(authMethods)); + bundle.setHasOAuthMethods(true); + bundle.setOauthMethods(getOAuthMethods(authMethods)); } if (hasBearerMethods(authMethods)) { bundle.put("hasBearerMethods", true); + bundle.setHasBearerMethods(true); } } @@ -854,12 +871,12 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } if (openAPI.getExternalDocs() != null) { - bundle.put("externalDocs", openAPI.getExternalDocs()); + bundle.setExternalDocs(openAPI.getExternalDocs()); } for (int i = 0; i < allModels.size() - 1; i++) { - HashMap<String, CodegenModel> cm = (HashMap<String, CodegenModel>) allModels.get(i); - CodegenModel m = cm.get("model"); + ModelBundle cm = allModels.get(i); + CodegenModel m = cm.getModel(); m.hasMoreModels = true; } @@ -893,14 +910,14 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { List<File> files = new ArrayList<File>(); // models List<String> filteredSchemas = ModelUtils.getSchemasUsedOnlyInFormParam(openAPI); - List<Object> allModels = new ArrayList<Object>(); + List<ModelBundle> allModels = new ArrayList<ModelBundle>(); generateModels(files, allModels, filteredSchemas); // apis - List<Object> allOperations = new ArrayList<Object>(); + List<ApiBundle> allOperations = new ArrayList<>(); generateApis(files, allOperations, allModels); // supporting files - Map<String, Object> bundle = buildSupportFileBundle(allOperations, allModels); + TemplatingInputBundle bundle = buildSupportFileBundle(allOperations, allModels); generateSupportingFiles(files, bundle); config.processOpenAPI(openAPI); @@ -911,7 +928,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } - protected File processTemplateToFile(Map<String, Object> templateData, String templateName, String outputFilename) throws IOException { + protected File processTemplateToFile(Bundle templateData, String templateName, String outputFilename) throws IOException { String adjustedOutputFilename = outputFilename.replaceAll("//", "/").replace('/', File.separatorChar); if (ignoreProcessor.allowsFile(new File(adjustedOutputFilename))) { String templateFile = getFullTemplateFile(config, templateName); @@ -1060,11 +1077,11 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } - private Map<String, Object> processOperations(CodegenConfig config, String tag, List<CodegenOperation> ops, List<Object> allModels) { - Map<String, Object> operations = new HashMap<String, Object>(); - Map<String, Object> objs = new HashMap<String, Object>(); - objs.put("classname", config.toApiName(tag)); - objs.put("pathPrefix", config.toApiVarName(tag)); + private ApiBundle processOperations(CodegenConfig config, String tag, List<CodegenOperation> ops, List<ModelBundle> allModels) { + ApiBundle operations = new ApiBundle(); + OperationsBundle objs = new OperationsBundle(); + objs.setClassname(config.toApiName(tag)); + objs.setPathPrefix(config.toApiVarName(tag)); // check for operationId uniqueness Set<String> opIds = new HashSet<String>(); @@ -1077,10 +1094,10 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } opIds.add(opId); } - objs.put("operation", ops); + objs.setOperation(ops); - operations.put("operations", objs); - operations.put("package", config.apiPackage()); + operations.setOperations(objs); + operations.setPackage(config.apiPackage()); Set<String> allImports = new TreeSet<String>(); for (CodegenOperation op : ops) { @@ -1106,16 +1123,18 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } } - operations.put("imports", imports); + operations.setImports(imports); // add a flag to indicate whether there's any {{import}} if (imports.size() > 0) { operations.put("hasImport", true); } - config.postProcessOperationsWithModels(operations, allModels); + List<Object> listAllModels = new ArrayList<Object>(allModels); + + config.postProcessOperationsWithModels(operations, listAllModels); if (objs.size() > 0) { - List<CodegenOperation> os = (List<CodegenOperation>) objs.get("operation"); + List<CodegenOperation> os = objs.getOperation(); if (os != null && os.size() > 0) { CodegenOperation op = os.get(os.size() - 1); @@ -1126,26 +1145,26 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } - private Map<String, Object> processModels(CodegenConfig config, Map<String, Schema> definitions) { - Map<String, Object> objs = new HashMap<String, Object>(); - objs.put("package", config.modelPackage()); - List<Object> models = new ArrayList<Object>(); + private ModelsBundle processModels(CodegenConfig config, Map<String, Schema> definitions) { + ModelsBundle objs = new ModelsBundle(); + objs.setPackage(config.modelPackage()); + List<ModelBundle> models = new ArrayList<ModelBundle>(); Set<String> allImports = new LinkedHashSet<String>(); for (String key : definitions.keySet()) { Schema schema = definitions.get(key); if (schema == null) throw new RuntimeException("schema cannot be null in processMoels"); CodegenModel cm = config.fromModel(key, schema); - Map<String, Object> mo = new HashMap<String, Object>(); - mo.put("model", cm); - mo.put("importPath", config.toModelImport(cm.classname)); + ModelBundle mo = new ModelBundle(); + mo.setModel(cm); + mo.setImportPath(config.toModelImport(cm.classname)); models.add(mo); cm.removeSelfReferenceImport(); allImports.addAll(cm.imports); } - objs.put("models", models); + objs.setModels(models); Set<String> importSet = new TreeSet<String>(); for (String nextImport : allImports) { String mapping = config.importMapping().get(nextImport); @@ -1167,7 +1186,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { item.put("import", s); imports.add(item); } - objs.put("imports", imports); + objs.setImports(imports); config.postProcessModels(objs); return objs; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiBundle.java new file mode 100644 index 00000000000..be0d8eee7a0 --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiBundle.java @@ -0,0 +1,248 @@ +package org.openapitools.codegen.templating; + +import java.util.*; + +import org.openapitools.codegen.CodegenSecurity; + +public class ApiBundle extends BaseBundle { + + private OperationsBundle operations; + private String _package; + private List<Map<String, String>> imports = new ArrayList<>(); + private String basePath; + private String basePathWithoutHost; + private String contextPath; + private String baseName; + private String apiPackage; + private String modelPackage; + private String classname; + private String classVarName; + private String importPath; + private String classFilename; + private Map<String, Object> vendorExtensions = new HashMap<>(); + private boolean sortParamsByRequiredFlag; + private Set<String> modelImports = new HashSet<>(); + private String commonPath; + private Collection<CodegenSecurity> authMethods = new ArrayList<>(); + private boolean hasMore; + + public ApiBundle() { + super(); + } + + public ApiBundle(Map<String, Object> objs) { + super(objs); + } + + + // hacky workaround for the templating engine to fetch truly dynamic values + @Override + public Object get(Object k){ + switch((String) k) { + case "hasImport" : return !imports.isEmpty(); + case "hasAuthMethods" : return !authMethods.isEmpty(); + } + return super.get(k); + } + + @Override + public boolean containsKey(Object k){ + if ("hasImport".equals(k)) { + return true; + } else if ("hasAuthMethods".equals(k)) { + return true; + } + return super.containsKey(k); + } + + // getters and setters. Each setter puts the value in the underlying Map + + public String getPackage() { + return _package; + } + + public void setPackage(String _package) { + this._package = _package; + put("package", _package); + } + + + public List<Map<String, String>> getImports() { + return imports; + } + + public void setImports(List<Map<String, String>> imports) { + this.imports = imports; + put("imports", imports); + } + + + public String getBasePath() { + return basePath; + } + + public void setBasePath(String basePath) { + this.basePath = basePath; + put("basePath", basePath); + } + + + public String getBasePathWithoutHost() { + return basePathWithoutHost; + } + + public void setBasePathWithoutHost(String basePathWithoutHost) { + this.basePathWithoutHost = basePathWithoutHost; + put("basePathWithoutHost", basePathWithoutHost); + } + + + public String getContextPath() { + return contextPath; + } + + public void setContextPath(String contextPath) { + this.contextPath = contextPath; + put("contextPath", contextPath); + } + + + public String getBaseName() { + return baseName; + } + + public void setBaseName(String baseName) { + this.baseName = baseName; + put("baseName", baseName); + } + + + public String getApiPackage() { + return apiPackage; + } + + public void setApiPackage(String apiPackage) { + this.apiPackage = apiPackage; + put("apiPackage", apiPackage); + } + + + public String getModelPackage() { + return modelPackage; + } + + public void setModelPackage(String modelPackage) { + this.modelPackage = modelPackage; + put("modelPackage", modelPackage); + } + + + public String getClassname() { + return classname; + } + + public void setClassname(String classname) { + this.classname = classname; + put("classname", classname); + } + + + public String getClassVarName() { + return classVarName; + } + + public void setClassVarName(String classVarName) { + this.classVarName = classVarName; + put("classVarName", classVarName); + } + + + public String getImportPath() { + return importPath; + } + + public void setImportPath(String importPath) { + this.importPath = importPath; + put("importPath", importPath); + } + + + public String getClassFilename() { + return classFilename; + } + + public void setClassFilename(String classFilename) { + this.classFilename = classFilename; + put("classFilename", classFilename); + } + + + public Map<String, Object> getVendorExtensions() { + return vendorExtensions; + } + + public void setVendorExtensions(Map<String, Object> vendorExtensions) { + this.vendorExtensions = vendorExtensions; + put("vendorExtensions", vendorExtensions); + } + + + public boolean isSortParamsByRequiredFlag() { + return sortParamsByRequiredFlag; + } + + public void setSortParamsByRequiredFlag(boolean sortParamsByRequiredFlag) { + this.sortParamsByRequiredFlag = sortParamsByRequiredFlag; + put("sortParamsByRequiredFlag", sortParamsByRequiredFlag); + } + + + public OperationsBundle getOperations() { + return this.operations; + } + + public void setOperations(OperationsBundle operations) { + this.operations = operations; + put("operations", operations); + } + + + public Set<String> getModelImports() { + return modelImports; + } + + public void setModelImports(Set<String> modelImports) { + this.modelImports = modelImports; + put("modelImports", modelImports); + } + + + public String getCommonPath() { + return commonPath; + } + + public void setCommonPath(String commonPath) { + this.commonPath = commonPath; + put("commonPath", commonPath); + } + + + public Collection<CodegenSecurity> getAuthMethods() { + return authMethods; + } + + public void setAuthMethods(Collection<CodegenSecurity> authMethods) { + this.authMethods = authMethods; + put("authMethods", authMethods); + } + + + public boolean getHasMore() { + return hasMore; + } + + public void setHasMore(boolean hasMore) { + this.hasMore = hasMore; + put("hasMore", hasMore); + } +} diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiInfoBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiInfoBundle.java new file mode 100644 index 00000000000..9b994169e8f --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiInfoBundle.java @@ -0,0 +1,20 @@ +package org.openapitools.codegen.templating; + +import java.util.ArrayList; +import java.util.List; + +public class ApiInfoBundle extends BaseBundle { + + private List<ApiBundle> apis = new ArrayList<>(); + + // getters and setters. Each setter puts the value in the underlying Map + + public List<ApiBundle> getApis() { + return this.apis; + } + + public void setApis(List<ApiBundle> apis) { + this.apis = apis; + put("apis", apis); + } +} diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/BaseBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/BaseBundle.java new file mode 100644 index 00000000000..5edb1df0d52 --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/BaseBundle.java @@ -0,0 +1,17 @@ +package org.openapitools.codegen.templating; + +import java.util.HashMap; +import java.util.Map; + +/** + * simply extend HashMap + */ +class BaseBundle extends HashMap<String, Object> implements Bundle { + + BaseBundle() { + } + + public BaseBundle(Map<String, Object> objs) { + this.putAll(objs); + } +} diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/Bundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/Bundle.java new file mode 100644 index 00000000000..fcdd43810c3 --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/Bundle.java @@ -0,0 +1,12 @@ +package org.openapitools.codegen.templating; + +import java.util.Map; + +/** + * a Bundle is a simple {@literal Map<String, Object>} + * but we add strongly typed fields to avoid + * - get("name") | put("name", value) pseudo-properties + * - the back and forth casting + */ +public interface Bundle extends Map<String, Object>{ +} diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/CodegenOperationBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/CodegenOperationBundle.java new file mode 100644 index 00000000000..641aebf5d4b --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/CodegenOperationBundle.java @@ -0,0 +1,44 @@ +package org.openapitools.codegen.templating; + +import org.openapitools.codegen.CodegenOperation; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; + +public class CodegenOperationBundle extends BaseBundle{ + private String path; + private Collection<CodegenOperation> operation = new ArrayList<>(); + private boolean hasMore; + + // getters and setters. Each setter puts the value in the underlying Map + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + put("path", path); + } + + + public Collection<CodegenOperation> getOperation() { + return operation; + } + + public void setOperation(Collection<CodegenOperation> operation) { + this.operation = operation; + put("operation", operation); + } + + + public boolean getHasMore() { + return hasMore; + } + + public void setHasMore(boolean hasMore) { + this.hasMore = hasMore; + put("hasMore", hasMore); + } +} diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java new file mode 100644 index 00000000000..6117f5d1b1b --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java @@ -0,0 +1,29 @@ +package org.openapitools.codegen.templating; + +import org.openapitools.codegen.CodegenModel; + +public class ModelBundle extends BaseBundle{ + CodegenModel model; + String importPath; + + // getters and setters. Each setter puts the value in the underlying Map + + public CodegenModel getModel() { + return model; + } + + public void setModel(CodegenModel model) { + this.model = model; + put("model", model); + } + + + public String getImportPath() { + return importPath; + } + + public void setImportPath(String importPath) { + this.importPath = importPath; + put("importPath", importPath); + } +} diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java new file mode 100644 index 00000000000..5840c001b15 --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java @@ -0,0 +1,72 @@ +package org.openapitools.codegen.templating; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ModelsBundle extends BaseBundle { + private String _package; + private List<ModelBundle> models = new ArrayList<>(); + private List<Map<String, String>> imports = new ArrayList<>(); + private String classname; + private String modelPackage; + + public ModelsBundle(Map<String, Object> objs) { + super(objs); + } + + public ModelsBundle() { + super(); + } + + // getters and setters. Each setter puts the value in the underlying Map + + public List<ModelBundle> getModels() { + return models; + } + + public void setModels(List<ModelBundle> models) { + this.models = models; + put("models", models); + } + + + public List<Map<String, String>> getImports() { + return imports; + } + + public void setImports(List<Map<String, String>> imports) { + this.imports = imports; + put("imports", imports); + } + + + public String getPackage() { + return _package; + } + + public void setPackage(String _package) { + this._package = _package; + put("package", _package); + } + + + public String getClassname() { + return classname; + } + + public void setClassname(String classname) { + this.classname = classname; + put("classname", classname); + } + + + public String getModelPackage() { + return modelPackage; + } + + public void setModelPackage(String modelPackage) { + this.modelPackage = modelPackage; + put("modelPackage", modelPackage); + } +} diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/OperationsBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/OperationsBundle.java new file mode 100644 index 00000000000..ef1ed7df10a --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/OperationsBundle.java @@ -0,0 +1,132 @@ +package org.openapitools.codegen.templating; + +import java.util.*; + +import org.openapitools.codegen.CodegenOperation; +import org.openapitools.codegen.CodegenSecurity; + +public class OperationsBundle extends BaseBundle{ + + private List<CodegenOperation> operation = new ArrayList<>(); + private String className; + private String pathPrefix; + private String controllerName; + private String symfonyService; + private Set<CodegenSecurity> authMethods = new HashSet<>(); + private String classnameSnakeUpperCase; + private String classnameSnakeLowerCase; + private String apiFilename; + private String interfacesToImplement; + private String pathPattern; + private List<CodegenOperationBundle> operationsByPath = new ArrayList<>(); + + // getters and setters. Each setter puts the value in the underlying Map + + public String getPathPrefix() { + return pathPrefix; + } + + public void setPathPrefix(String pathPrefix) { + this.pathPrefix = pathPrefix; + put("pathPrefix", pathPrefix); + } + + public List<CodegenOperation> getOperation() { + return this.operation; + } + + public void setOperation(List<CodegenOperation> operation) { + this.operation = operation; + put("operation", operation); + } + + + public String getClassname() { + return className; + } + + public void setClassname(String className) { + this.className = className; + put("className", className); + } + + + public String getControllerName() { + return controllerName; + } + + public void setControllerName(String controllerName) { + this.controllerName = controllerName; + put("controllerName", controllerName); + } + + + public Set<CodegenSecurity> getAuthMethods() { + return authMethods; + } + + public void setAuthMethods(Set<CodegenSecurity> authMethods) { + this.authMethods = authMethods; + put("authMethods", authMethods); + } + + + public String getClassnameSnakeUpperCase() { + return classnameSnakeUpperCase; + } + + public void setClassnameSnakeUpperCase(String classnameSnakeUpperCase) { + this.classnameSnakeUpperCase = classnameSnakeUpperCase; + put("classnameSnakeUpperCase", classnameSnakeUpperCase); + } + + + public String getClassnameSnakeLowerCase() { + return classnameSnakeLowerCase; + } + + public void setClassnameSnakeLowerCase(String classnameSnakeLowerCase) { + this.classnameSnakeLowerCase = classnameSnakeLowerCase; + put("classnameSnakeLowerCase", classnameSnakeLowerCase); + } + + + public String getApiFilename() { + return apiFilename; + } + + public void setApiFilename(String apiFilename) { + this.apiFilename = apiFilename; + put("apiFilename", apiFilename); + } + + + public String getInterfacesToImplement() { + return interfacesToImplement; + } + + public void setInterfacesToImplement(String interfacesToImplement) { + this.interfacesToImplement = interfacesToImplement; + put("interfacesToImplement", interfacesToImplement); + } + + + public String getPathPattern() { + return pathPattern; + } + + public void setPathPattern(String pathPattern) { + this.pathPattern = pathPattern; + put("pathPattern", pathPattern); + } + + + public List<CodegenOperationBundle> getOperationsByPath() { + return operationsByPath; + } + + public void setOperationsByPath(List<CodegenOperationBundle> operationsByPath) { + this.operationsByPath = operationsByPath; + put("operationsByPath", operationsByPath); + } +} diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java new file mode 100644 index 00000000000..07626e8239e --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java @@ -0,0 +1,266 @@ +package org.openapitools.codegen.templating; + +import io.swagger.v3.oas.models.ExternalDocumentation; +import io.swagger.v3.oas.models.OpenAPI; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.openapitools.codegen.CodegenSecurity; + +public class TemplatingInputBundle extends BaseBundle { + + private String apiPackage; + private OpenAPI openAPI; + private String modelPackage; + private String basePath; + private String basePathWithoutHost; + private String scheme; + private String host; + private String contextPath; + private ApiInfoBundle apiInfo; + private List<ModelBundle> models = new ArrayList<>(); + private String apiFolder; + private List<CodegenSecurity> authMethods = new ArrayList<>(); + private ExternalDocumentation externalDocs; + private String openapiJson; + private String openapiYaml; + private List<Map<String, String>> pathSet = new ArrayList<>(); + private List<ModelBundle> orderedModels = new ArrayList<>(); + private boolean hasAuthMethods; + private boolean hasOAuthMethods; + private List<CodegenSecurity> oauthMethods; + private boolean hasBearerMethods; + + public TemplatingInputBundle() { + super(); + } + + public TemplatingInputBundle(Map<String, Object> objs) { + super(objs); + } + + // hacky workaround for the templating engine to fetch truly dynamic values + @Override + public Object get(Object k) { + switch ((String) k) { + case "hasAuthMethods": + return !authMethods.isEmpty(); + } + return super.get(k); + } + + @Override + public boolean containsKey(Object k) { + if ("hasAuthMethods".equals(k)) { + return true; + } + return super.containsKey(k); + } + + // getters and setters. Each setter puts the value in the underlying Map + + public String getApiPackage() { + return apiPackage; + } + + public void setApiPackage(String apiPackage) { + this.apiPackage = apiPackage; + put("apiPackage", apiPackage); + } + + + public OpenAPI getOpenAPI() { + return openAPI; + } + + public void setOpenAPI(OpenAPI openAPI) { + this.openAPI = openAPI; + put("openAPI", openAPI); + } + + + public String getModelPackage() { + return modelPackage; + } + + public void setModelPackage(String modelPackage) { + this.modelPackage = modelPackage; + put("modelPackage", modelPackage); + } + + + public String getBasePath() { + return basePath; + } + + public void setBasePath(String basePath) { + this.basePath = basePath; + put("basePath", basePath); + } + + + public String getBasePathWithoutHost() { + return basePathWithoutHost; + } + + public void setBasePathWithoutHost(String basePathWithoutHost) { + this.basePathWithoutHost = basePathWithoutHost; + put("basePathWithoutHost", basePathWithoutHost); + } + + + public String getScheme() { + return scheme; + } + + public void setScheme(String scheme) { + this.scheme = scheme; + put("scheme", scheme); + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + put("host", host); + } + + + public String getContextPath() { + return contextPath; + } + + public void setContextPath(String contextPath) { + this.contextPath = contextPath; + put("contextPath", contextPath); + } + + + public ApiInfoBundle getApiInfo() { + return apiInfo; + } + + public void setApiInfo(ApiInfoBundle apiInfo) { + this.apiInfo = apiInfo; + put("apiInfo", apiInfo); + } + + + public List<ModelBundle> getModels() { + return models; + } + + public void setModels(List<ModelBundle> models) { + this.models = models; + put("models", models); + } + + + public String getApiFolder() { + return apiFolder; + } + + public void setApiFolder(String apiFolder) { + this.apiFolder = apiFolder; + put("apiFolder", apiFolder); + } + + + public List<CodegenSecurity> getAuthMethods() { + return authMethods; + } + + public void setAuthMethods(List<CodegenSecurity> authMethods) { + this.authMethods = authMethods; + put("authMethods", authMethods); + } + + + public ExternalDocumentation getExternalDocs() { + return externalDocs; + } + + public void setExternalDocs(ExternalDocumentation externalDocs) { + this.externalDocs = externalDocs; + put("externalDocs", externalDocs); + } + + + public String getOpenapiJson() { + return openapiJson; + } + + public void setOpenapiJson(String openapiJson) { + this.openapiJson = openapiJson; + put("openapiJson", openapiJson); + put("openapi-json", openapiJson); + } + + + public String getOpenapiYaml() { + return openapiYaml; + } + + public void setOpenapiYaml(String openapiYaml) { + this.openapiYaml = openapiYaml; + put("openapiYaml", openapiYaml); + put("openapi-yaml", openapiYaml); + } + + + public List<Map<String, String>> getPathSet() { + return pathSet; + } + + public void setPathSet(List<Map<String, String>> pathSet) { + this.pathSet = pathSet; + put("pathSet", pathSet); + } + + + public List<ModelBundle> getOrderedModels() { + return orderedModels; + } + + public void setOrderedModels( + List<ModelBundle> orderedModels) { + this.orderedModels = orderedModels; + put("orderedModels", orderedModels); + } + + public void setHasAuthMethods(boolean hasAuthMethods) { + this.hasAuthMethods = hasAuthMethods; + } + + public boolean getHasAuthMethods() { + return hasAuthMethods; + } + + public void setHasOAuthMethods(boolean hasOAuthMethods) { + this.hasOAuthMethods = hasOAuthMethods; + } + + public boolean getHasOAuthMethods() { + return hasOAuthMethods; + } + + public void setOauthMethods(List<CodegenSecurity> oauthMethods) { + this.oauthMethods = oauthMethods; + } + + public List<CodegenSecurity> getOauthMethods() { + return oauthMethods; + } + + public void setHasBearerMethods(boolean hasBearerMethods) { + this.hasBearerMethods = hasBearerMethods; + } + + public boolean getHasBearerMethods() { + return this.hasBearerMethods; + } +} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/MockDefaultGenerator.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/MockDefaultGenerator.java index 8ee454a700d..3f43cee19f0 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/MockDefaultGenerator.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/MockDefaultGenerator.java @@ -16,6 +16,8 @@ package org.openapitools.codegen; +import org.openapitools.codegen.templating.Bundle; + import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; @@ -31,7 +33,7 @@ public class MockDefaultGenerator extends DefaultGenerator { private Map<String, String> files = new HashMap<>(); @Override - protected File processTemplateToFile(Map<String, Object> templateData, String templateName, String outputFilename) throws IOException { + protected File processTemplateToFile(Bundle templateData, String templateName, String outputFilename) throws IOException { templateBasedFiles.add(new WrittenTemplateBasedFile(templateData, templateName, normalizePath(outputFilename))); return super.processTemplateToFile(templateData, templateName, outputFilename); } @@ -61,17 +63,17 @@ public class MockDefaultGenerator extends DefaultGenerator { } public static class WrittenTemplateBasedFile { - private Map<String, Object> templateData; + private Bundle templateData; private String templateName; private String outputFilename; - public WrittenTemplateBasedFile(Map<String, Object> templateData, String templateName, String outputFilename) { + public WrittenTemplateBasedFile(Bundle templateData, String templateName, String outputFilename) { this.templateData = templateData; this.templateName = templateName; this.outputFilename = outputFilename; } - public Map<String, Object> getTemplateData() { + public Bundle getTemplateData() { return templateData; } -- GitLab From 11eda296beb30f021de887b70d2e379e6d7184fe Mon Sep 17 00:00:00 2001 From: rienafairefr <rienafairefr@gmail.com> Date: Wed, 13 Feb 2019 15:49:52 +0100 Subject: [PATCH 2/6] add copy constructor from Map<String, Object>, remove unused properties --- .../codegen/templating/ApiBundle.java | 41 -------- .../codegen/templating/ApiInfoBundle.java | 1 + .../codegen/templating/BaseBundle.java | 3 - .../codegen/templating/ModelBundle.java | 11 +++ .../codegen/templating/ModelsBundle.java | 11 ++- .../codegen/templating/OperationsBundle.java | 96 +------------------ .../templating/TemplatingInputBundle.java | 62 +++--------- 7 files changed, 36 insertions(+), 189 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiBundle.java index be0d8eee7a0..eb86aebee8b 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiBundle.java @@ -21,20 +21,9 @@ public class ApiBundle extends BaseBundle { private String classFilename; private Map<String, Object> vendorExtensions = new HashMap<>(); private boolean sortParamsByRequiredFlag; - private Set<String> modelImports = new HashSet<>(); - private String commonPath; private Collection<CodegenSecurity> authMethods = new ArrayList<>(); private boolean hasMore; - public ApiBundle() { - super(); - } - - public ApiBundle(Map<String, Object> objs) { - super(objs); - } - - // hacky workaround for the templating engine to fetch truly dynamic values @Override public Object get(Object k){ @@ -207,36 +196,6 @@ public class ApiBundle extends BaseBundle { } - public Set<String> getModelImports() { - return modelImports; - } - - public void setModelImports(Set<String> modelImports) { - this.modelImports = modelImports; - put("modelImports", modelImports); - } - - - public String getCommonPath() { - return commonPath; - } - - public void setCommonPath(String commonPath) { - this.commonPath = commonPath; - put("commonPath", commonPath); - } - - - public Collection<CodegenSecurity> getAuthMethods() { - return authMethods; - } - - public void setAuthMethods(Collection<CodegenSecurity> authMethods) { - this.authMethods = authMethods; - put("authMethods", authMethods); - } - - public boolean getHasMore() { return hasMore; } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiInfoBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiInfoBundle.java index 9b994169e8f..b9583b5da9d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiInfoBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiInfoBundle.java @@ -2,6 +2,7 @@ package org.openapitools.codegen.templating; import java.util.ArrayList; import java.util.List; +import java.util.Map; public class ApiInfoBundle extends BaseBundle { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/BaseBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/BaseBundle.java index 5edb1df0d52..7e365a496ce 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/BaseBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/BaseBundle.java @@ -11,7 +11,4 @@ class BaseBundle extends HashMap<String, Object> implements Bundle { BaseBundle() { } - public BaseBundle(Map<String, Object> objs) { - this.putAll(objs); - } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java index 6117f5d1b1b..b5fffe8bfa0 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java @@ -2,10 +2,21 @@ package org.openapitools.codegen.templating; import org.openapitools.codegen.CodegenModel; +import java.util.Map; + public class ModelBundle extends BaseBundle{ CodegenModel model; String importPath; + public ModelBundle(Map<String, Object> model) { + this.model = (CodegenModel) model.get("model"); + this.importPath = (String) model.get("importPath"); + } + + public ModelBundle() { + super(); + } + // getters and setters. Each setter puts the value in the underlying Map public CodegenModel getModel() { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java index 5840c001b15..7370781ad16 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java @@ -11,8 +11,15 @@ public class ModelsBundle extends BaseBundle { private String classname; private String modelPackage; - public ModelsBundle(Map<String, Object> objs) { - super(objs); + public ModelsBundle (Map<String, Object> value) { + this._package = (String) value.get("package"); + List<Map<String, Object>> models = (List<Map<String, Object>>) value.get("models"); + for (Map<String, Object> model : models) { + this.models.add(new ModelBundle(model)); + } + this.imports = (List<Map<String, String>>) value.get("imports"); + this.classname = (String) value.get("classname"); + this.modelPackage = (String) value.get("modelPackage"); } public ModelsBundle() { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/OperationsBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/OperationsBundle.java index ef1ed7df10a..588139df676 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/OperationsBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/OperationsBundle.java @@ -8,17 +8,8 @@ import org.openapitools.codegen.CodegenSecurity; public class OperationsBundle extends BaseBundle{ private List<CodegenOperation> operation = new ArrayList<>(); - private String className; + private String classname; private String pathPrefix; - private String controllerName; - private String symfonyService; - private Set<CodegenSecurity> authMethods = new HashSet<>(); - private String classnameSnakeUpperCase; - private String classnameSnakeLowerCase; - private String apiFilename; - private String interfacesToImplement; - private String pathPattern; - private List<CodegenOperationBundle> operationsByPath = new ArrayList<>(); // getters and setters. Each setter puts the value in the underlying Map @@ -42,91 +33,12 @@ public class OperationsBundle extends BaseBundle{ public String getClassname() { - return className; + return classname; } public void setClassname(String className) { - this.className = className; - put("className", className); + this.classname = className; + put("classname", className); } - - public String getControllerName() { - return controllerName; - } - - public void setControllerName(String controllerName) { - this.controllerName = controllerName; - put("controllerName", controllerName); - } - - - public Set<CodegenSecurity> getAuthMethods() { - return authMethods; - } - - public void setAuthMethods(Set<CodegenSecurity> authMethods) { - this.authMethods = authMethods; - put("authMethods", authMethods); - } - - - public String getClassnameSnakeUpperCase() { - return classnameSnakeUpperCase; - } - - public void setClassnameSnakeUpperCase(String classnameSnakeUpperCase) { - this.classnameSnakeUpperCase = classnameSnakeUpperCase; - put("classnameSnakeUpperCase", classnameSnakeUpperCase); - } - - - public String getClassnameSnakeLowerCase() { - return classnameSnakeLowerCase; - } - - public void setClassnameSnakeLowerCase(String classnameSnakeLowerCase) { - this.classnameSnakeLowerCase = classnameSnakeLowerCase; - put("classnameSnakeLowerCase", classnameSnakeLowerCase); - } - - - public String getApiFilename() { - return apiFilename; - } - - public void setApiFilename(String apiFilename) { - this.apiFilename = apiFilename; - put("apiFilename", apiFilename); - } - - - public String getInterfacesToImplement() { - return interfacesToImplement; - } - - public void setInterfacesToImplement(String interfacesToImplement) { - this.interfacesToImplement = interfacesToImplement; - put("interfacesToImplement", interfacesToImplement); - } - - - public String getPathPattern() { - return pathPattern; - } - - public void setPathPattern(String pathPattern) { - this.pathPattern = pathPattern; - put("pathPattern", pathPattern); - } - - - public List<CodegenOperationBundle> getOperationsByPath() { - return operationsByPath; - } - - public void setOperationsByPath(List<CodegenOperationBundle> operationsByPath) { - this.operationsByPath = operationsByPath; - put("operationsByPath", operationsByPath); - } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java index 07626e8239e..9e884b01f1a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java @@ -24,23 +24,12 @@ public class TemplatingInputBundle extends BaseBundle { private String apiFolder; private List<CodegenSecurity> authMethods = new ArrayList<>(); private ExternalDocumentation externalDocs; - private String openapiJson; - private String openapiYaml; private List<Map<String, String>> pathSet = new ArrayList<>(); - private List<ModelBundle> orderedModels = new ArrayList<>(); private boolean hasAuthMethods; private boolean hasOAuthMethods; private List<CodegenSecurity> oauthMethods; private boolean hasBearerMethods; - public TemplatingInputBundle() { - super(); - } - - public TemplatingInputBundle(Map<String, Object> objs) { - super(objs); - } - // hacky workaround for the templating engine to fetch truly dynamic values @Override public Object get(Object k) { @@ -190,28 +179,6 @@ public class TemplatingInputBundle extends BaseBundle { } - public String getOpenapiJson() { - return openapiJson; - } - - public void setOpenapiJson(String openapiJson) { - this.openapiJson = openapiJson; - put("openapiJson", openapiJson); - put("openapi-json", openapiJson); - } - - - public String getOpenapiYaml() { - return openapiYaml; - } - - public void setOpenapiYaml(String openapiYaml) { - this.openapiYaml = openapiYaml; - put("openapiYaml", openapiYaml); - put("openapi-yaml", openapiYaml); - } - - public List<Map<String, String>> getPathSet() { return pathSet; } @@ -222,45 +189,38 @@ public class TemplatingInputBundle extends BaseBundle { } - public List<ModelBundle> getOrderedModels() { - return orderedModels; - } - - public void setOrderedModels( - List<ModelBundle> orderedModels) { - this.orderedModels = orderedModels; - put("orderedModels", orderedModels); + public boolean getHasAuthMethods() { + return hasAuthMethods; } public void setHasAuthMethods(boolean hasAuthMethods) { this.hasAuthMethods = hasAuthMethods; } - public boolean getHasAuthMethods() { - return hasAuthMethods; + + public boolean getHasOAuthMethods() { + return hasOAuthMethods; } public void setHasOAuthMethods(boolean hasOAuthMethods) { this.hasOAuthMethods = hasOAuthMethods; } - public boolean getHasOAuthMethods() { - return hasOAuthMethods; + + public List<CodegenSecurity> getOauthMethods() { + return oauthMethods; } public void setOauthMethods(List<CodegenSecurity> oauthMethods) { this.oauthMethods = oauthMethods; } - public List<CodegenSecurity> getOauthMethods() { - return oauthMethods; + + public boolean getHasBearerMethods() { + return this.hasBearerMethods; } public void setHasBearerMethods(boolean hasBearerMethods) { this.hasBearerMethods = hasBearerMethods; } - - public boolean getHasBearerMethods() { - return this.hasBearerMethods; - } } -- GitLab From 01284e642307fd905b77e749a2886a14ae7b0113 Mon Sep 17 00:00:00 2001 From: rienafairefr <rienafairefr@gmail.com> Date: Thu, 14 Feb 2019 09:37:18 +0100 Subject: [PATCH 3/6] use setters in constructors, the underlying map isn't updated otherwise --- .../codegen/templating/ModelBundle.java | 4 ++-- .../codegen/templating/ModelsBundle.java | 13 ++++++++----- .../codegen/templating/TemplatingInputBundle.java | 14 ++++---------- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java index b5fffe8bfa0..82f986b7c5f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java @@ -9,8 +9,8 @@ public class ModelBundle extends BaseBundle{ String importPath; public ModelBundle(Map<String, Object> model) { - this.model = (CodegenModel) model.get("model"); - this.importPath = (String) model.get("importPath"); + setModel((CodegenModel) model.get("model")); + setImportPath((String) model.get("importPath")); } public ModelBundle() { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java index 7370781ad16..893f6a7cba7 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java @@ -11,15 +11,18 @@ public class ModelsBundle extends BaseBundle { private String classname; private String modelPackage; + @SuppressWarnings("unchecked") public ModelsBundle (Map<String, Object> value) { - this._package = (String) value.get("package"); + setPackage((String) value.get("package")); List<Map<String, Object>> models = (List<Map<String, Object>>) value.get("models"); + List<ModelBundle> modelBundles = new ArrayList<>(); for (Map<String, Object> model : models) { - this.models.add(new ModelBundle(model)); + modelBundles.add(new ModelBundle(model)); } - this.imports = (List<Map<String, String>>) value.get("imports"); - this.classname = (String) value.get("classname"); - this.modelPackage = (String) value.get("modelPackage"); + setModels(modelBundles); + setImports((List<Map<String, String>>) value.get("imports")); + setClassname((String) value.get("classname")); + setModelPackage((String) value.get("modelPackage")); } public ModelsBundle() { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java index 9e884b01f1a..a5c0244b64f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java @@ -179,22 +179,13 @@ public class TemplatingInputBundle extends BaseBundle { } - public List<Map<String, String>> getPathSet() { - return pathSet; - } - - public void setPathSet(List<Map<String, String>> pathSet) { - this.pathSet = pathSet; - put("pathSet", pathSet); - } - - public boolean getHasAuthMethods() { return hasAuthMethods; } public void setHasAuthMethods(boolean hasAuthMethods) { this.hasAuthMethods = hasAuthMethods; + put("hasAuthMethods", hasAuthMethods); } @@ -204,6 +195,7 @@ public class TemplatingInputBundle extends BaseBundle { public void setHasOAuthMethods(boolean hasOAuthMethods) { this.hasOAuthMethods = hasOAuthMethods; + put("hasOAuthMethods", hasOAuthMethods); } @@ -213,6 +205,7 @@ public class TemplatingInputBundle extends BaseBundle { public void setOauthMethods(List<CodegenSecurity> oauthMethods) { this.oauthMethods = oauthMethods; + put("oauthMethods", oauthMethods); } @@ -222,5 +215,6 @@ public class TemplatingInputBundle extends BaseBundle { public void setHasBearerMethods(boolean hasBearerMethods) { this.hasBearerMethods = hasBearerMethods; + put("hasBearerMethods", hasBearerMethods); } } -- GitLab From 339d9e2f0004dc7a81c308859171ba7e44534677 Mon Sep 17 00:00:00 2001 From: rienafairefr <rienafairefr@gmail.com> Date: Sun, 17 Feb 2019 00:09:58 +0100 Subject: [PATCH 4/6] preserve order in back-forth casting around postProcessAllModels --- .../main/java/org/openapitools/codegen/DefaultGenerator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index 3572543abd9..d482cccb2ac 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -464,13 +464,13 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { } // loop through all models to update children models, isSelfReference, isCircularReference, etc - Map<String, Object> processed = new HashMap<String, Object>(allProcessedModels); + Map<String, Object> processed = new LinkedHashMap<String, Object>(allProcessedModels); processed = config.updateAllModels(processed); // post process all processed models processed = config.postProcessAllModels(processed); - allProcessedModels = new HashMap<String, ModelsBundle>(); + allProcessedModels = new LinkedHashMap<String, ModelsBundle>(); for (Map.Entry<String, Object> entry: processed.entrySet()) { allProcessedModels.put(entry.getKey(), new ModelsBundle((Map<String, Object>) entry.getValue())); } -- GitLab From e6b97a9c5c1a52a66b6dbb33c4bc6d2bf7a3514c Mon Sep 17 00:00:00 2001 From: rienafairefr <rienafairefr@gmail.com> Date: Sun, 17 Feb 2019 00:54:42 +0100 Subject: [PATCH 5/6] fix copy constructors --- .../codegen/templating/BaseBundle.java | 3 ++ .../codegen/templating/ModelBundle.java | 9 ++++-- .../codegen/templating/ModelsBundle.java | 29 +++++++++++++------ 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/BaseBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/BaseBundle.java index 7e365a496ce..5651cb17d30 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/BaseBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/BaseBundle.java @@ -11,4 +11,7 @@ class BaseBundle extends HashMap<String, Object> implements Bundle { BaseBundle() { } + public BaseBundle(Map<String, Object> value) { + super(value); + } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java index 82f986b7c5f..b7720f79198 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelBundle.java @@ -9,8 +9,13 @@ public class ModelBundle extends BaseBundle{ String importPath; public ModelBundle(Map<String, Object> model) { - setModel((CodegenModel) model.get("model")); - setImportPath((String) model.get("importPath")); + super(model); + if (model.containsKey("model")) { + setModel((CodegenModel) model.get("model")); + } + if (model.containsKey("importPath")) { + setImportPath((String) model.get("importPath")); + } } public ModelBundle() { diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java index 893f6a7cba7..b685863c167 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ModelsBundle.java @@ -13,16 +13,27 @@ public class ModelsBundle extends BaseBundle { @SuppressWarnings("unchecked") public ModelsBundle (Map<String, Object> value) { - setPackage((String) value.get("package")); - List<Map<String, Object>> models = (List<Map<String, Object>>) value.get("models"); - List<ModelBundle> modelBundles = new ArrayList<>(); - for (Map<String, Object> model : models) { - modelBundles.add(new ModelBundle(model)); + super(value); + if (value.containsKey("packages")) { + setPackage((String) value.get("package")); + } + if (value.containsKey("models")) { + List<Map<String, Object>> models = (List<Map<String, Object>>) value.get("models"); + List<ModelBundle> modelBundles = new ArrayList<>(); + for (Map<String, Object> model : models) { + modelBundles.add(new ModelBundle(model)); + } + setModels(modelBundles); + } + if (value.containsKey("imports")) { + setImports((List<Map<String, String>>) value.get("imports")); + } + if (value.containsKey("classname")) { + setClassname((String) value.get("classname")); + } + if (value.containsKey("modelPackage")) { + setModelPackage((String) value.get("modelPackage")); } - setModels(modelBundles); - setImports((List<Map<String, String>>) value.get("imports")); - setClassname((String) value.get("classname")); - setModelPackage((String) value.get("modelPackage")); } public ModelsBundle() { -- GitLab From ec6a6d67df3293ba19b10fb93af6032ce8593e68 Mon Sep 17 00:00:00 2001 From: rienafairefr <rienafairefr@gmail.com> Date: Sun, 17 Feb 2019 23:11:26 +0100 Subject: [PATCH 6/6] fix hasImport/hasAuth --- .../codegen/DefaultGenerator.java | 2 +- .../codegen/templating/ApiBundle.java | 29 +++++++------------ .../templating/TemplatingInputBundle.java | 18 ------------ 3 files changed, 11 insertions(+), 38 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index d482cccb2ac..ac39f59be34 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -1127,7 +1127,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { // add a flag to indicate whether there's any {{import}} if (imports.size() > 0) { - operations.put("hasImport", true); + operations.setHasImport(true); } List<Object> listAllModels = new ArrayList<Object>(allModels); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiBundle.java index eb86aebee8b..f06ed04626b 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/ApiBundle.java @@ -23,26 +23,8 @@ public class ApiBundle extends BaseBundle { private boolean sortParamsByRequiredFlag; private Collection<CodegenSecurity> authMethods = new ArrayList<>(); private boolean hasMore; + private boolean hasImport; - // hacky workaround for the templating engine to fetch truly dynamic values - @Override - public Object get(Object k){ - switch((String) k) { - case "hasImport" : return !imports.isEmpty(); - case "hasAuthMethods" : return !authMethods.isEmpty(); - } - return super.get(k); - } - - @Override - public boolean containsKey(Object k){ - if ("hasImport".equals(k)) { - return true; - } else if ("hasAuthMethods".equals(k)) { - return true; - } - return super.containsKey(k); - } // getters and setters. Each setter puts the value in the underlying Map @@ -204,4 +186,13 @@ public class ApiBundle extends BaseBundle { this.hasMore = hasMore; put("hasMore", hasMore); } + + public void setHasImport(boolean hasImport) { + this.hasImport = hasImport; + put("hasImport", hasImport); + } + + public boolean getHasImport() { + return hasImport; + } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java index a5c0244b64f..c8d1a4386be 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/TemplatingInputBundle.java @@ -30,24 +30,6 @@ public class TemplatingInputBundle extends BaseBundle { private List<CodegenSecurity> oauthMethods; private boolean hasBearerMethods; - // hacky workaround for the templating engine to fetch truly dynamic values - @Override - public Object get(Object k) { - switch ((String) k) { - case "hasAuthMethods": - return !authMethods.isEmpty(); - } - return super.get(k); - } - - @Override - public boolean containsKey(Object k) { - if ("hasAuthMethods".equals(k)) { - return true; - } - return super.containsKey(k); - } - // getters and setters. Each setter puts the value in the underlying Map public String getApiPackage() { -- GitLab