From 723cf9b823c444ce95dc245cd56818fde84b55b5 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Thu, 22 Oct 2015 14:03:44 -0700 Subject: [PATCH 1/4] made selective generation of models --- .../io/swagger/codegen/DefaultGenerator.java | 306 ++++++++++-------- 1 file changed, 164 insertions(+), 142 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java index d240d43d92d..f72d1acaa2a 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java @@ -29,16 +29,7 @@ import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; public class DefaultGenerator extends AbstractGenerator implements Generator { Logger LOGGER = LoggerFactory.getLogger(DefaultGenerator.class); @@ -60,6 +51,22 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { @Override public List generate() { + boolean generateApis = true; + boolean generateModels = true; + boolean generateSupportingFiles = true; + + Set modelsToGenerate = null; + + // allows generating only models by specifying a CSV of models to generate, or empty for all + if(System.getProperty("models") != null) { + generateApis = false; + generateSupportingFiles = false; + String modelNames = System.getProperty("models"); + if(!modelNames.isEmpty()) { + modelsToGenerate = new HashSet(Arrays.asList(modelNames.split(","))); + } + } + if (swagger == null || config == null) { throw new RuntimeException("missing swagger input or config!"); } @@ -139,28 +146,97 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { if (definitions != null) { List sortedModelKeys = sortModelsByInheritance(definitions); - for (String name : sortedModelKeys) { - try { - - //dont generate models that have an import mapping - if(config.importMapping().containsKey(name)) { - continue; + if(generateModels) { + if(modelsToGenerate != null) { + List updatedKeys = new ArrayList(); + for(String m : sortedModelKeys) { + if(modelsToGenerate.contains(m)) { + updatedKeys.add(m); + } } + sortedModelKeys = updatedKeys; + } - Model model = definitions.get(name); - Map modelMap = new HashMap(); - modelMap.put(name, model); - Map models = processModels(config, modelMap, definitions); - models.putAll(config.additionalProperties()); - - allModels.add(((List) models.get("models")).get(0)); - - for (String templateName : config.modelTemplateFiles().keySet()) { - String suffix = config.modelTemplateFiles().get(templateName); - String filename = config.modelFileFolder() + File.separator + config.toModelFilename(name) + suffix; - if (!config.shouldOverwrite(filename)) { + for (String name : sortedModelKeys) { + try { + //don't generate models that have an import mapping + if(config.importMapping().containsKey(name)) { continue; } + + Model model = definitions.get(name); + Map modelMap = new HashMap(); + modelMap.put(name, model); + Map models = processModels(config, modelMap, definitions); + models.putAll(config.additionalProperties()); + + allModels.add(((List) models.get("models")).get(0)); + + for (String templateName : config.modelTemplateFiles().keySet()) { + String suffix = config.modelTemplateFiles().get(templateName); + String filename = config.modelFileFolder() + File.separator + config.toModelFilename(name) + suffix; + if (!config.shouldOverwrite(filename)) { + continue; + } + String templateFile = getFullTemplateFile(config, templateName); + String template = readTemplate(templateFile); + Template tmpl = Mustache.compiler() + .withLoader(new Mustache.TemplateLoader() { + @Override + public Reader getTemplate(String name) { + return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); + } + }) + .defaultValue("") + .compile(template); + writeToFile(filename, tmpl.execute(models)); + files.add(new File(filename)); + } + } catch (Exception e) { + throw new RuntimeException("Could not generate model '" + name + "'", e); + } + } + } + } + if (System.getProperty("debugModels") != null) { + System.out.println("############ Model info ############"); + Json.prettyPrint(allModels); + } + + // apis + Map> paths = processPaths(swagger.getPaths()); + if(generateApis) { + for (String tag : paths.keySet()) { + try { + List ops = paths.get(tag); + Map operation = processOperations(config, tag, ops); + + operation.put("basePath", basePath); + operation.put("contextPath", contextPath); + operation.put("baseName", tag); + operation.put("modelPackage", config.modelPackage()); + operation.putAll(config.additionalProperties()); + operation.put("classname", config.toApiName(tag)); + operation.put("classVarName", config.toApiVarName(tag)); + operation.put("importPath", config.toApiImport(tag)); + + processMimeTypes(swagger.getConsumes(), operation, "consumes"); + processMimeTypes(swagger.getProduces(), operation, "produces"); + + allOperations.add(new HashMap(operation)); + for (int i = 0; i < allOperations.size(); i++) { + Map oo = (Map) allOperations.get(i); + if (i < (allOperations.size() - 1)) { + oo.put("hasMore", "true"); + } + } + + for (String templateName : config.apiTemplateFiles().keySet()) { + String filename = config.apiFilename(templateName, tag); + if (!config.shouldOverwrite(filename) && new File(filename).exists()) { + continue; + } + String templateFile = getFullTemplateFile(config, templateName); String template = readTemplate(templateFile); Template tmpl = Mustache.compiler() @@ -172,71 +248,15 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { }) .defaultValue("") .compile(template); - writeToFile(filename, tmpl.execute(models)); + + writeToFile(filename, tmpl.execute(operation)); files.add(new File(filename)); } } catch (Exception e) { - throw new RuntimeException("Could not generate model '" + name + "'", e); + throw new RuntimeException("Could not generate api file for '" + tag + "'", e); } } } - if (System.getProperty("debugModels") != null) { - System.out.println("############ Model info ############"); - Json.prettyPrint(allModels); - } - - // apis - Map> paths = processPaths(swagger.getPaths()); - for (String tag : paths.keySet()) { - try { - List ops = paths.get(tag); - Map operation = processOperations(config, tag, ops); - - operation.put("basePath", basePath); - operation.put("contextPath", contextPath); - operation.put("baseName", tag); - operation.put("modelPackage", config.modelPackage()); - operation.putAll(config.additionalProperties()); - operation.put("classname", config.toApiName(tag)); - operation.put("classVarName", config.toApiVarName(tag)); - operation.put("importPath", config.toApiImport(tag)); - - processMimeTypes(swagger.getConsumes(), operation, "consumes"); - processMimeTypes(swagger.getProduces(), operation, "produces"); - - allOperations.add(new HashMap(operation)); - for (int i = 0; i < allOperations.size(); i++) { - Map oo = (Map) allOperations.get(i); - if (i < (allOperations.size() - 1)) { - oo.put("hasMore", "true"); - } - } - - for (String templateName : config.apiTemplateFiles().keySet()) { - String filename = config.apiFilename(templateName, tag); - if (!config.shouldOverwrite(filename) && new File(filename).exists()) { - continue; - } - - String templateFile = getFullTemplateFile(config, templateName); - String template = readTemplate(templateFile); - Template tmpl = Mustache.compiler() - .withLoader(new Mustache.TemplateLoader() { - @Override - public Reader getTemplate(String name) { - return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); - } - }) - .defaultValue("") - .compile(template); - - writeToFile(filename, tmpl.execute(operation)); - files.add(new File(filename)); - } - } catch (Exception e) { - throw new RuntimeException("Could not generate api file for '" + tag + "'", e); - } - } if (System.getProperty("debugOperations") != null) { System.out.println("############ Operation info ############"); Json.prettyPrint(allOperations); @@ -280,66 +300,68 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { Json.prettyPrint(bundle); } - for (SupportingFile support : config.supportingFiles()) { - try { - String outputFolder = config.outputFolder(); - if (isNotEmpty(support.folder)) { - outputFolder += File.separator + support.folder; - } - File of = new File(outputFolder); - if (!of.isDirectory()) { - of.mkdirs(); - } - String outputFilename = outputFolder + File.separator + support.destinationFilename; - if (!config.shouldOverwrite(outputFilename)) { - continue; - } - - String templateFile = getFullTemplateFile(config, support.templateFile); - - if (templateFile.endsWith("mustache")) { - String template = readTemplate(templateFile); - Template tmpl = Mustache.compiler() - .withLoader(new Mustache.TemplateLoader() { - @Override - public Reader getTemplate(String name) { - return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); - } - }) - .defaultValue("") - .compile(template); - - writeToFile(outputFilename, tmpl.execute(bundle)); - files.add(new File(outputFilename)); - } else { - InputStream in = null; - - try { - in = new FileInputStream(templateFile); - } catch (Exception e) { - // continue + if(generateSupportingFiles) { + for (SupportingFile support : config.supportingFiles()) { + try { + String outputFolder = config.outputFolder(); + if (isNotEmpty(support.folder)) { + outputFolder += File.separator + support.folder; } - if (in == null) { - in = this.getClass().getClassLoader().getResourceAsStream(getCPResourcePath(templateFile)); + File of = new File(outputFolder); + if (!of.isDirectory()) { + of.mkdirs(); } - File outputFile = new File(outputFilename); - OutputStream out = new FileOutputStream(outputFile, false); - if (in != null && out != null) { - System.out.println("writing file " + outputFile); - IOUtils.copy(in, out); + String outputFilename = outputFolder + File.separator + support.destinationFilename; + if (!config.shouldOverwrite(outputFilename)) { + continue; + } + + String templateFile = getFullTemplateFile(config, support.templateFile); + + if (templateFile.endsWith("mustache")) { + String template = readTemplate(templateFile); + Template tmpl = Mustache.compiler() + .withLoader(new Mustache.TemplateLoader() { + @Override + public Reader getTemplate(String name) { + return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); + } + }) + .defaultValue("") + .compile(template); + + writeToFile(outputFilename, tmpl.execute(bundle)); + files.add(new File(outputFilename)); } else { - if (in == null) { - System.out.println("can't open " + templateFile + " for input"); - } - if (out == null) { - System.out.println("can't open " + outputFile + " for output"); - } - } + InputStream in = null; - files.add(outputFile); + try { + in = new FileInputStream(templateFile); + } catch (Exception e) { + // continue + } + if (in == null) { + in = this.getClass().getClassLoader().getResourceAsStream(getCPResourcePath(templateFile)); + } + File outputFile = new File(outputFilename); + OutputStream out = new FileOutputStream(outputFile, false); + if (in != null && out != null) { + System.out.println("writing file " + outputFile); + IOUtils.copy(in, out); + } else { + if (in == null) { + System.out.println("can't open " + templateFile + " for input"); + } + if (out == null) { + System.out.println("can't open " + outputFile + " for output"); + } + } + + files.add(outputFile); + } + } catch (Exception e) { + throw new RuntimeException("Could not generate supporting file '" + support + "'", e); } - } catch (Exception e) { - throw new RuntimeException("Could not generate supporting file '" + support + "'", e); } } From 9f842a1295b97549eecdce540b8e112a0b993ce3 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Thu, 22 Oct 2015 14:34:52 -0700 Subject: [PATCH 2/4] added environment variable support --- .../java/io/swagger/codegen/plugin/CodeGenMojo.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/CodeGenMojo.java b/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/CodeGenMojo.java index 21eef59b010..805afe22a94 100644 --- a/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/CodeGenMojo.java +++ b/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/CodeGenMojo.java @@ -36,6 +36,7 @@ import config.Config; import config.ConfigParser; import java.io.File; +import java.util.HashMap; import java.util.Map; import java.util.ServiceLoader; @@ -112,6 +113,9 @@ public class CodeGenMojo extends AbstractMojo { @Parameter(defaultValue = "true") private boolean addCompileSourceRoot = true; + @Parameter + protected Map environmentVariables = new HashMap(); + /** * The project being built. */ @@ -125,6 +129,12 @@ public class CodeGenMojo extends AbstractMojo { CodegenConfig config = CodegenConfigLoader.forName(language); config.setOutputDir(output.getAbsolutePath()); + if (environmentVariables != null) { + for(String key : environmentVariables.keySet()) { + System.setProperty(key, environmentVariables.get(key)); + } + } + if (null != templateDirectory) { config.additionalProperties().put(TEMPLATE_DIR_PARAM, templateDirectory.getAbsolutePath()); } From 6253a592d96a34cd3a3d3ea29bf9018e4a3dc762 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Thu, 22 Oct 2015 14:54:29 -0700 Subject: [PATCH 3/4] added optional support for apis, supoprtingFiles --- .../io/swagger/codegen/DefaultGenerator.java | 133 ++++++++++++------ 1 file changed, 92 insertions(+), 41 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java index f72d1acaa2a..b1b7dd4e046 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java @@ -51,21 +51,52 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { @Override public List generate() { - boolean generateApis = true; - boolean generateModels = true; - boolean generateSupportingFiles = true; + Boolean generateApis = null; + Boolean generateModels = null; + Boolean generateSupportingFiles = null; Set modelsToGenerate = null; + Set apisToGenerate = null; + Set supportingFilesToGenerate = null; // allows generating only models by specifying a CSV of models to generate, or empty for all if(System.getProperty("models") != null) { - generateApis = false; - generateSupportingFiles = false; String modelNames = System.getProperty("models"); if(!modelNames.isEmpty()) { + generateModels = true; modelsToGenerate = new HashSet(Arrays.asList(modelNames.split(","))); } } + if(System.getProperty("apis") != null) { + String apiNames = System.getProperty("apis"); + if(!apiNames.isEmpty()) { + generateApis = true; + apisToGenerate = new HashSet(Arrays.asList(apiNames.split(","))); + } + } + if(System.getProperty("supportingFiles") != null) { + String supportingFiles = System.getProperty("supportingFiles"); + if(!supportingFiles.isEmpty()) { + generateSupportingFiles = true; + supportingFilesToGenerate = new HashSet(Arrays.asList(supportingFiles.split(","))); + } + } + + if(generateApis == null && apisToGenerate == null && supportingFilesToGenerate == null) { + // no specifics are set, generate everything + generateApis = true; generateModels = true; generateSupportingFiles = true; + } + else { + if(generateApis == null) { + generateApis = false; + } + if(generateModels == null) { + generateModels = false; + } + if(generateSupportingFiles == null) { + generateSupportingFiles = false; + } + } if (swagger == null || config == null) { throw new RuntimeException("missing swagger input or config!"); @@ -206,6 +237,15 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { // apis Map> paths = processPaths(swagger.getPaths()); if(generateApis) { + if(apisToGenerate != null) { + Map> updatedPaths = new TreeMap>(); + for(String m : paths.keySet()) { + if(apisToGenerate.contains(m)) { + updatedPaths.put(m, paths.get(m)); + } + } + paths = updatedPaths; + } for (String tag : paths.keySet()) { try { List ops = paths.get(tag); @@ -318,46 +358,57 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { String templateFile = getFullTemplateFile(config, support.templateFile); - if (templateFile.endsWith("mustache")) { - String template = readTemplate(templateFile); - Template tmpl = Mustache.compiler() - .withLoader(new Mustache.TemplateLoader() { - @Override - public Reader getTemplate(String name) { - return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); - } - }) - .defaultValue("") - .compile(template); - - writeToFile(outputFilename, tmpl.execute(bundle)); - files.add(new File(outputFilename)); - } else { - InputStream in = null; - - try { - in = new FileInputStream(templateFile); - } catch (Exception e) { - // continue + boolean shouldGenerate = true; + if(supportingFilesToGenerate != null) { + if(supportingFilesToGenerate.contains(support.destinationFilename)) { + shouldGenerate = true; } - if (in == null) { - in = this.getClass().getClassLoader().getResourceAsStream(getCPResourcePath(templateFile)); + else { + shouldGenerate = false; } - File outputFile = new File(outputFilename); - OutputStream out = new FileOutputStream(outputFile, false); - if (in != null && out != null) { - System.out.println("writing file " + outputFile); - IOUtils.copy(in, out); + } + if(shouldGenerate) { + if (templateFile.endsWith("mustache")) { + String template = readTemplate(templateFile); + Template tmpl = Mustache.compiler() + .withLoader(new Mustache.TemplateLoader() { + @Override + public Reader getTemplate(String name) { + return getTemplateReader(config.templateDir() + File.separator + name + ".mustache"); + } + }) + .defaultValue("") + .compile(template); + + writeToFile(outputFilename, tmpl.execute(bundle)); + files.add(new File(outputFilename)); } else { - if (in == null) { - System.out.println("can't open " + templateFile + " for input"); - } - if (out == null) { - System.out.println("can't open " + outputFile + " for output"); - } - } + InputStream in = null; - files.add(outputFile); + try { + in = new FileInputStream(templateFile); + } catch (Exception e) { + // continue + } + if (in == null) { + in = this.getClass().getClassLoader().getResourceAsStream(getCPResourcePath(templateFile)); + } + File outputFile = new File(outputFilename); + OutputStream out = new FileOutputStream(outputFile, false); + if (in != null && out != null) { + System.out.println("writing file " + outputFile); + IOUtils.copy(in, out); + } else { + if (in == null) { + System.out.println("can't open " + templateFile + " for input"); + } + if (out == null) { + System.out.println("can't open " + outputFile + " for output"); + } + } + + files.add(outputFile); + } } } catch (Exception e) { throw new RuntimeException("Could not generate supporting file '" + support + "'", e); From 7170f7fa0143b3348afeec7dc5fbf627e85fcb17 Mon Sep 17 00:00:00 2001 From: Tony Tam Date: Thu, 22 Oct 2015 15:28:49 -0700 Subject: [PATCH 4/4] updated supporitng file support --- .../java/io/swagger/codegen/DefaultGenerator.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java index b1b7dd4e046..8a017bfc07e 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultGenerator.java @@ -62,27 +62,27 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { // allows generating only models by specifying a CSV of models to generate, or empty for all if(System.getProperty("models") != null) { String modelNames = System.getProperty("models"); + generateModels = true; if(!modelNames.isEmpty()) { - generateModels = true; modelsToGenerate = new HashSet(Arrays.asList(modelNames.split(","))); } } if(System.getProperty("apis") != null) { String apiNames = System.getProperty("apis"); + generateApis = true; if(!apiNames.isEmpty()) { - generateApis = true; apisToGenerate = new HashSet(Arrays.asList(apiNames.split(","))); } } if(System.getProperty("supportingFiles") != null) { String supportingFiles = System.getProperty("supportingFiles"); + generateSupportingFiles = true; if(!supportingFiles.isEmpty()) { - generateSupportingFiles = true; supportingFilesToGenerate = new HashSet(Arrays.asList(supportingFiles.split(","))); } } - if(generateApis == null && apisToGenerate == null && supportingFilesToGenerate == null) { + if(generateApis == null && generateModels == null && generateSupportingFiles == null) { // no specifics are set, generate everything generateApis = true; generateModels = true; generateSupportingFiles = true; } @@ -178,7 +178,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { List sortedModelKeys = sortModelsByInheritance(definitions); if(generateModels) { - if(modelsToGenerate != null) { + if(modelsToGenerate != null && modelsToGenerate.size() > 0) { List updatedKeys = new ArrayList(); for(String m : sortedModelKeys) { if(modelsToGenerate.contains(m)) { @@ -237,7 +237,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { // apis Map> paths = processPaths(swagger.getPaths()); if(generateApis) { - if(apisToGenerate != null) { + if(apisToGenerate != null && apisToGenerate.size() > 0) { Map> updatedPaths = new TreeMap>(); for(String m : paths.keySet()) { if(apisToGenerate.contains(m)) { @@ -359,7 +359,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { String templateFile = getFullTemplateFile(config, support.templateFile); boolean shouldGenerate = true; - if(supportingFilesToGenerate != null) { + if(supportingFilesToGenerate != null && supportingFilesToGenerate.size() > 0) { if(supportingFilesToGenerate.contains(support.destinationFilename)) { shouldGenerate = true; }