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