Allow overriding of only some templates when using --template-dir option. Templates which aren't found in the template directory will fall back to the ones packaged/distributed with Swagger

This commit is contained in:
Steffen Furholm 2015-10-16 23:29:08 +02:00
parent a2fda604f8
commit 8bc4c1f05e
33 changed files with 59 additions and 33 deletions

View File

@ -70,14 +70,29 @@ public abstract class AbstractGenerator {
String libTemplateFile = config.templateDir() + File.separator + String libTemplateFile = config.templateDir() + File.separator +
"libraries" + File.separator + library + File.separator + "libraries" + File.separator + library + File.separator +
templateFile; templateFile;
if (templateExists(libTemplateFile)) {
if (new File(libTemplateFile).exists()) {
return libTemplateFile;
}
libTemplateFile = config.embeddedTemplateDir() + File.separator +
"libraries" + File.separator + library + File.separator +
templateFile;
if (embeddedTemplateExists(libTemplateFile)) {
// Fall back to the template file embedded/packaged in the JAR file...
return libTemplateFile; return libTemplateFile;
} }
} }
return config.templateDir() + File.separator + templateFile; String template = config.templateDir() + File.separator + templateFile;
if (new File(template).exists()) {
return template;
} else {
// Fall back to the template file embedded/packaged in the JAR file...
return config.embeddedTemplateDir() + File.separator + templateFile;
}
} }
public boolean templateExists(String name) { public boolean embeddedTemplateExists(String name) {
return this.getClass().getClassLoader().getResource(getCPResourcePath(name)) != null; return this.getClass().getClassLoader().getResource(getCPResourcePath(name)) != null;
} }

View File

@ -29,6 +29,8 @@ public interface CodegenConfig {
String templateDir(); String templateDir();
String embeddedTemplateDir();
String modelFileFolder(); String modelFileFolder();
String modelPackage(); String modelPackage();

View File

@ -78,6 +78,7 @@ public class DefaultCodegen {
protected Map<String, String> apiTemplateFiles = new HashMap<String, String>(); protected Map<String, String> apiTemplateFiles = new HashMap<String, String>();
protected Map<String, String> modelTemplateFiles = new HashMap<String, String>(); protected Map<String, String> modelTemplateFiles = new HashMap<String, String>();
protected String templateDir; protected String templateDir;
protected String embeddedTemplateDir;
protected Map<String, Object> additionalProperties = new HashMap<String, Object>(); protected Map<String, Object> additionalProperties = new HashMap<String, Object>();
protected List<SupportingFile> supportingFiles = new ArrayList<SupportingFile>(); protected List<SupportingFile> supportingFiles = new ArrayList<SupportingFile>();
protected List<CliOption> cliOptions = new ArrayList<CliOption>(); protected List<CliOption> cliOptions = new ArrayList<CliOption>();
@ -183,6 +184,14 @@ public class DefaultCodegen {
return templateDir; return templateDir;
} }
public String embeddedTemplateDir() {
if (embeddedTemplateDir != null) {
return embeddedTemplateDir;
} else {
return templateDir;
}
}
public Map<String, String> apiTemplateFiles() { public Map<String, String> apiTemplateFiles() {
return apiTemplateFiles; return apiTemplateFiles;
} }

View File

@ -68,7 +68,7 @@ public class AkkaScalaClientCodegen extends DefaultCodegen implements CodegenCon
outputFolder = "generated-code/scala"; outputFolder = "generated-code/scala";
modelTemplateFiles.put("model.mustache", ".scala"); modelTemplateFiles.put("model.mustache", ".scala");
apiTemplateFiles.put("api.mustache", ".scala"); apiTemplateFiles.put("api.mustache", ".scala");
templateDir = "akka-scala"; embeddedTemplateDir = templateDir = "akka-scala";
apiPackage = mainPackage + ".api"; apiPackage = mainPackage + ".api";
modelPackage = mainPackage + ".model"; modelPackage = mainPackage + ".model";

View File

@ -30,7 +30,7 @@ public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfi
outputFolder = "generated-code/android"; outputFolder = "generated-code/android";
modelTemplateFiles.put("model.mustache", ".java"); modelTemplateFiles.put("model.mustache", ".java");
apiTemplateFiles.put("api.mustache", ".java"); apiTemplateFiles.put("api.mustache", ".java");
templateDir = "android-java"; embeddedTemplateDir = templateDir = "android-java";
apiPackage = "io.swagger.client.api"; apiPackage = "io.swagger.client.api";
modelPackage = "io.swagger.client.model"; modelPackage = "io.swagger.client.model";

View File

@ -40,7 +40,7 @@ public class AsyncScalaClientCodegen extends DefaultCodegen implements CodegenCo
outputFolder = "generated-code/async-scala"; outputFolder = "generated-code/async-scala";
modelTemplateFiles.put("model.mustache", ".scala"); modelTemplateFiles.put("model.mustache", ".scala");
apiTemplateFiles.put("api.mustache", ".scala"); apiTemplateFiles.put("api.mustache", ".scala");
templateDir = "asyncscala"; embeddedTemplateDir = templateDir = "asyncscala";
apiPackage = "io.swagger.client.api"; apiPackage = "io.swagger.client.api";
modelPackage = "io.swagger.client.model"; modelPackage = "io.swagger.client.model";

View File

@ -27,7 +27,7 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig
outputFolder = "generated-code" + File.separator + "csharp"; outputFolder = "generated-code" + File.separator + "csharp";
modelTemplateFiles.put("model.mustache", ".cs"); modelTemplateFiles.put("model.mustache", ".cs");
apiTemplateFiles.put("api.mustache", ".cs"); apiTemplateFiles.put("api.mustache", ".cs");
templateDir = "csharp"; embeddedTemplateDir = templateDir = "csharp";
apiPackage = "IO.Swagger.Api"; apiPackage = "IO.Swagger.Api";
modelPackage = "IO.Swagger.Model"; modelPackage = "IO.Swagger.Model";

View File

@ -25,7 +25,7 @@ public class CsharpDotNet2ClientCodegen extends DefaultCodegen implements Codege
outputFolder = "generated-code" + File.separator + "CsharpDotNet2"; outputFolder = "generated-code" + File.separator + "CsharpDotNet2";
modelTemplateFiles.put("model.mustache", ".cs"); modelTemplateFiles.put("model.mustache", ".cs");
apiTemplateFiles.put("api.mustache", ".cs"); apiTemplateFiles.put("api.mustache", ".cs");
templateDir = "CsharpDotNet2"; embeddedTemplateDir = templateDir = "CsharpDotNet2";
apiPackage = "IO.Swagger.Api"; apiPackage = "IO.Swagger.Api";
modelPackage = "IO.Swagger.Model"; modelPackage = "IO.Swagger.Model";

View File

@ -26,7 +26,7 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig {
outputFolder = "generated-code/dart"; outputFolder = "generated-code/dart";
modelTemplateFiles.put("model.mustache", ".dart"); modelTemplateFiles.put("model.mustache", ".dart");
apiTemplateFiles.put("api.mustache", ".dart"); apiTemplateFiles.put("api.mustache", ".dart");
templateDir = "dart"; embeddedTemplateDir = templateDir = "dart";
apiPackage = "lib.api"; apiPackage = "lib.api";
modelPackage = "lib.model"; modelPackage = "lib.model";

View File

@ -40,7 +40,7 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig
modelTemplateFiles.put("model.mustache", ".as"); modelTemplateFiles.put("model.mustache", ".as");
modelTemplateFiles.put("modelList.mustache", "List.as"); modelTemplateFiles.put("modelList.mustache", "List.as");
apiTemplateFiles.put("api.mustache", ".as"); apiTemplateFiles.put("api.mustache", ".as");
templateDir = "flash"; embeddedTemplateDir = templateDir = "flash";
languageSpecificPrimitives.clear(); languageSpecificPrimitives.clear();
languageSpecificPrimitives.add("Number"); languageSpecificPrimitives.add("Number");

View File

@ -47,7 +47,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig {
outputFolder = "generated-code/java"; outputFolder = "generated-code/java";
modelTemplateFiles.put("model.mustache", ".java"); modelTemplateFiles.put("model.mustache", ".java");
apiTemplateFiles.put("api.mustache", ".java"); apiTemplateFiles.put("api.mustache", ".java");
templateDir = "Java"; embeddedTemplateDir = templateDir = "Java";
apiPackage = "io.swagger.client.api"; apiPackage = "io.swagger.client.api";
modelPackage = "io.swagger.client.model"; modelPackage = "io.swagger.client.model";

View File

@ -30,7 +30,7 @@ public class JavaInflectorServerCodegen extends JavaClientCodegen implements Cod
sourceFolder = "src/main/java"; sourceFolder = "src/main/java";
modelTemplateFiles.put("model.mustache", ".java"); modelTemplateFiles.put("model.mustache", ".java");
apiTemplateFiles.put("api.mustache", ".java"); apiTemplateFiles.put("api.mustache", ".java");
templateDir = "JavaInflector"; embeddedTemplateDir = templateDir = "JavaInflector";
invokerPackage = "io.swagger.handler"; invokerPackage = "io.swagger.handler";
artifactId = "swagger-inflector-server"; artifactId = "swagger-inflector-server";

View File

@ -31,7 +31,7 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf
apiTemplateFiles.put("apiService.mustache", ".java"); apiTemplateFiles.put("apiService.mustache", ".java");
apiTemplateFiles.put("apiServiceImpl.mustache", ".java"); apiTemplateFiles.put("apiServiceImpl.mustache", ".java");
apiTemplateFiles.put("apiServiceFactory.mustache", ".java"); apiTemplateFiles.put("apiServiceFactory.mustache", ".java");
templateDir = "JavaJaxRS"; embeddedTemplateDir = templateDir = "JavaJaxRS";
apiPackage = System.getProperty("swagger.codegen.jaxrs.apipackage", "io.swagger.api"); apiPackage = System.getProperty("swagger.codegen.jaxrs.apipackage", "io.swagger.api");
modelPackage = System.getProperty("swagger.codegen.jaxrs.modelpackage", "io.swagger.model"); modelPackage = System.getProperty("swagger.codegen.jaxrs.modelpackage", "io.swagger.model");

View File

@ -55,7 +55,7 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig
* Template Location. This is the location which templates will be read from. The generator * Template Location. This is the location which templates will be read from. The generator
* will use the resource stream to attempt to read the templates. * will use the resource stream to attempt to read the templates.
*/ */
templateDir = "nodejs"; embeddedTemplateDir = templateDir = "nodejs";
/** /**
* Reserved words. Override this with reserved words specific to your language * Reserved words. Override this with reserved words specific to your language

View File

@ -36,7 +36,7 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig {
modelTemplateFiles.put("model-body.mustache", ".m"); modelTemplateFiles.put("model-body.mustache", ".m");
apiTemplateFiles.put("api-header.mustache", ".h"); apiTemplateFiles.put("api-header.mustache", ".h");
apiTemplateFiles.put("api-body.mustache", ".m"); apiTemplateFiles.put("api-body.mustache", ".m");
templateDir = "objc"; embeddedTemplateDir = templateDir = "objc";
defaultIncludes.clear(); defaultIncludes.clear();
defaultIncludes.add("bool"); defaultIncludes.add("bool");

View File

@ -25,7 +25,7 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig {
outputFolder = "generated-code" + File.separatorChar + "perl"; outputFolder = "generated-code" + File.separatorChar + "perl";
modelTemplateFiles.put("object.mustache", ".pm"); modelTemplateFiles.put("object.mustache", ".pm");
apiTemplateFiles.put("api.mustache", ".pm"); apiTemplateFiles.put("api.mustache", ".pm");
templateDir = "perl"; embeddedTemplateDir = templateDir = "perl";
reservedWords = new HashSet<String>( reservedWords = new HashSet<String>(

View File

@ -33,7 +33,7 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig {
outputFolder = "generated-code" + File.separator + "php"; outputFolder = "generated-code" + File.separator + "php";
modelTemplateFiles.put("model.mustache", ".php"); modelTemplateFiles.put("model.mustache", ".php");
apiTemplateFiles.put("api.mustache", ".php"); apiTemplateFiles.put("api.mustache", ".php");
templateDir = "php"; embeddedTemplateDir = templateDir = "php";
apiPackage = invokerPackage + "\\Api"; apiPackage = invokerPackage + "\\Api";
modelPackage = invokerPackage + "\\Model"; modelPackage = invokerPackage + "\\Model";

View File

@ -27,7 +27,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig
outputFolder = "generated-code" + File.separatorChar + "python"; outputFolder = "generated-code" + File.separatorChar + "python";
modelTemplateFiles.put("model.mustache", ".py"); modelTemplateFiles.put("model.mustache", ".py");
apiTemplateFiles.put("api.mustache", ".py"); apiTemplateFiles.put("api.mustache", ".py");
templateDir = "python"; embeddedTemplateDir = templateDir = "python";
languageSpecificPrimitives.clear(); languageSpecificPrimitives.clear();
languageSpecificPrimitives.add("int"); languageSpecificPrimitives.add("int");

View File

@ -71,7 +71,7 @@ public class Qt5CPPGenerator extends DefaultCodegen implements CodegenConfig {
* Template Location. This is the location which templates will be read from. The generator * Template Location. This is the location which templates will be read from. The generator
* will use the resource stream to attempt to read the templates. * will use the resource stream to attempt to read the templates.
*/ */
templateDir = "qt5cpp"; embeddedTemplateDir = templateDir = "qt5cpp";
/** /**
* Reserved words. Override this with reserved words specific to your language * Reserved words. Override this with reserved words specific to your language

View File

@ -28,7 +28,7 @@ public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig {
outputFolder = "generated-code" + File.separator + "ruby"; outputFolder = "generated-code" + File.separator + "ruby";
modelTemplateFiles.put("model.mustache", ".rb"); modelTemplateFiles.put("model.mustache", ".rb");
apiTemplateFiles.put("api.mustache", ".rb"); apiTemplateFiles.put("api.mustache", ".rb");
templateDir = "ruby"; embeddedTemplateDir = templateDir = "ruby";
typeMapping.clear(); typeMapping.clear();
languageSpecificPrimitives.clear(); languageSpecificPrimitives.clear();

View File

@ -42,7 +42,7 @@ public class ScalaClientCodegen extends DefaultCodegen implements CodegenConfig
outputFolder = "generated-code/scala"; outputFolder = "generated-code/scala";
modelTemplateFiles.put("model.mustache", ".scala"); modelTemplateFiles.put("model.mustache", ".scala");
apiTemplateFiles.put("api.mustache", ".scala"); apiTemplateFiles.put("api.mustache", ".scala");
templateDir = "scala"; embeddedTemplateDir = templateDir = "scala";
apiPackage = "io.swagger.client.api"; apiPackage = "io.swagger.client.api";
modelPackage = "io.swagger.client.model"; modelPackage = "io.swagger.client.model";

View File

@ -29,7 +29,7 @@ public class ScalatraServerCodegen extends DefaultCodegen implements CodegenConf
outputFolder = "generated-code/scalatra"; outputFolder = "generated-code/scalatra";
modelTemplateFiles.put("model.mustache", ".scala"); modelTemplateFiles.put("model.mustache", ".scala");
apiTemplateFiles.put("api.mustache", ".scala"); apiTemplateFiles.put("api.mustache", ".scala");
templateDir = "scalatra"; embeddedTemplateDir = templateDir = "scalatra";
apiPackage = "com.wordnik.client.api"; apiPackage = "com.wordnik.client.api";
modelPackage = "com.wordnik.client.model"; modelPackage = "com.wordnik.client.model";

View File

@ -35,7 +35,7 @@ public class SilexServerCodegen extends DefaultCodegen implements CodegenConfig
modelTemplateFiles.clear(); modelTemplateFiles.clear();
apiTemplateFiles.clear(); apiTemplateFiles.clear();
templateDir = "silex"; embeddedTemplateDir = templateDir = "silex";
reservedWords = new HashSet<String>( reservedWords = new HashSet<String>(
Arrays.asList( Arrays.asList(

View File

@ -29,7 +29,7 @@ public class SinatraServerCodegen extends DefaultCodegen implements CodegenConfi
// no model // no model
modelTemplateFiles.clear(); modelTemplateFiles.clear();
apiTemplateFiles.put("api.mustache", ".rb"); apiTemplateFiles.put("api.mustache", ".rb");
templateDir = "sinatra"; embeddedTemplateDir = templateDir = "sinatra";
typeMapping.clear(); typeMapping.clear();
languageSpecificPrimitives.clear(); languageSpecificPrimitives.clear();

View File

@ -23,7 +23,7 @@ public class SpringMVCServerCodegen extends JavaClientCodegen implements Codegen
outputFolder = "generated-code/javaSpringMVC"; outputFolder = "generated-code/javaSpringMVC";
modelTemplateFiles.put("model.mustache", ".java"); modelTemplateFiles.put("model.mustache", ".java");
apiTemplateFiles.put("api.mustache", ".java"); apiTemplateFiles.put("api.mustache", ".java");
templateDir = "JavaSpringMVC"; embeddedTemplateDir = templateDir = "JavaSpringMVC";
apiPackage = "io.swagger.api"; apiPackage = "io.swagger.api";
modelPackage = "io.swagger.model"; modelPackage = "io.swagger.model";
configPackage = "io.swagger.configuration"; configPackage = "io.swagger.configuration";

View File

@ -20,7 +20,7 @@ public class StaticDocCodegen extends DefaultCodegen implements CodegenConfig {
outputFolder = "docs"; outputFolder = "docs";
modelTemplateFiles.put("model.mustache", ".html"); modelTemplateFiles.put("model.mustache", ".html");
apiTemplateFiles.put("operation.mustache", ".html"); apiTemplateFiles.put("operation.mustache", ".html");
templateDir = "swagger-static"; embeddedTemplateDir = templateDir = "swagger-static";
additionalProperties.put(CodegenConstants.INVOKER_PACKAGE, invokerPackage); additionalProperties.put(CodegenConstants.INVOKER_PACKAGE, invokerPackage);
additionalProperties.put(CodegenConstants.GROUP_ID, groupId); additionalProperties.put(CodegenConstants.GROUP_ID, groupId);

View File

@ -28,7 +28,7 @@ public class StaticHtmlGenerator extends DefaultCodegen implements CodegenConfig
public StaticHtmlGenerator() { public StaticHtmlGenerator() {
super(); super();
outputFolder = "docs"; outputFolder = "docs";
templateDir = "htmlDocs"; embeddedTemplateDir = templateDir = "htmlDocs";
defaultIncludes = new HashSet<String>(); defaultIncludes = new HashSet<String>();

View File

@ -13,7 +13,7 @@ import java.io.File;
public class SwaggerGenerator extends DefaultCodegen implements CodegenConfig { public class SwaggerGenerator extends DefaultCodegen implements CodegenConfig {
public SwaggerGenerator() { public SwaggerGenerator() {
super(); super();
templateDir = "swagger"; embeddedTemplateDir = templateDir = "swagger";
outputFolder = "generated-code/swagger"; outputFolder = "generated-code/swagger";
supportingFiles.add(new SupportingFile("README.md", "", "README.md")); supportingFiles.add(new SupportingFile("README.md", "", "README.md"));

View File

@ -13,7 +13,7 @@ import java.io.File;
public class SwaggerYamlGenerator extends DefaultCodegen implements CodegenConfig { public class SwaggerYamlGenerator extends DefaultCodegen implements CodegenConfig {
public SwaggerYamlGenerator() { public SwaggerYamlGenerator() {
super(); super();
templateDir = "swagger"; embeddedTemplateDir = templateDir = "swagger";
outputFolder = "generated-code/swagger"; outputFolder = "generated-code/swagger";
supportingFiles.add(new SupportingFile("README.md", "", "README.md")); supportingFiles.add(new SupportingFile("README.md", "", "README.md"));

View File

@ -46,7 +46,7 @@ public class SwiftCodegen extends DefaultCodegen implements CodegenConfig {
outputFolder = "generated-code" + File.separator + "swift"; outputFolder = "generated-code" + File.separator + "swift";
modelTemplateFiles.put("model.mustache", ".swift"); modelTemplateFiles.put("model.mustache", ".swift");
apiTemplateFiles.put("api.mustache", ".swift"); apiTemplateFiles.put("api.mustache", ".swift");
templateDir = "swift"; embeddedTemplateDir = templateDir = "swift";
apiPackage = File.separator + "APIs"; apiPackage = File.separator + "APIs";
modelPackage = File.separator + "Models"; modelPackage = File.separator + "Models";

View File

@ -40,7 +40,7 @@ public class TizenClientCodegen extends DefaultCodegen implements CodegenConfig
modelTemplateFiles.put("model-body.mustache", ".cpp"); modelTemplateFiles.put("model-body.mustache", ".cpp");
apiTemplateFiles.put("api-header.mustache", ".h"); apiTemplateFiles.put("api-header.mustache", ".h");
apiTemplateFiles.put("api-body.mustache", ".cpp"); apiTemplateFiles.put("api-body.mustache", ".cpp");
templateDir = "tizen"; embeddedTemplateDir = templateDir = "tizen";
modelPackage = ""; modelPackage = "";
defaultIncludes = new HashSet<String>( defaultIncludes = new HashSet<String>(

View File

@ -20,7 +20,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode
outputFolder = "generated-code/typescript-angular"; outputFolder = "generated-code/typescript-angular";
modelTemplateFiles.put("model.mustache", ".ts"); modelTemplateFiles.put("model.mustache", ".ts");
apiTemplateFiles.put("api.mustache", ".ts"); apiTemplateFiles.put("api.mustache", ".ts");
templateDir = "TypeScript-Angular"; embeddedTemplateDir = templateDir = "TypeScript-Angular";
apiPackage = "API.Client"; apiPackage = "API.Client";
modelPackage = "API.Client"; modelPackage = "API.Client";
supportingFiles.add(new SupportingFile("api.d.mustache", apiPackage().replace('.', File.separatorChar), "api.d.ts")); supportingFiles.add(new SupportingFile("api.d.mustache", apiPackage().replace('.', File.separatorChar), "api.d.ts"));

View File

@ -17,7 +17,7 @@ public class TypeScriptNodeClientCodegen extends AbstractTypeScriptClientCodegen
public TypeScriptNodeClientCodegen() { public TypeScriptNodeClientCodegen() {
super(); super();
outputFolder = "generated-code/typescript-node"; outputFolder = "generated-code/typescript-node";
templateDir = "TypeScript-node"; embeddedTemplateDir = templateDir = "TypeScript-node";
supportingFiles.add(new SupportingFile("api.mustache", null, "api.ts")); supportingFiles.add(new SupportingFile("api.mustache", null, "api.ts"));
} }