diff --git a/.gitignore b/.gitignore index db34c76636c6..02ecb7220cdf 100644 --- a/.gitignore +++ b/.gitignore @@ -58,7 +58,7 @@ samples/client/petstore/silex/SwaggerServer/venodr/ samples/client/petstore/python/.projectile samples/client/petstore/python/.venv/ -*/.settings +.settings *.mustache~ *.java~ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4bef580bb265..f80eeb3cd013 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ - Before submitting an issue, search the [open issue](https://github.com/swagger-api/swagger-codegen/issues) and [closed issue](https://github.com/swagger-api/swagger-codegen/issues?q=is%3Aissue+is%3Aclosed) to ensure no one else has reported something similar before. - The issue should contain details on how to repeat the issue, e.g. - - the Swagger spec for reproducing the issue (:bulb: use [Gist](https://gist.github.com) to share). If the Swagger spec cannot be shared publicly, it will be hard for the community to help + - the OpenAPI Spec for reproducing the issue (:bulb: use [Gist](https://gist.github.com) to share). If the OpenAPI Spec cannot be shared publicly, it will be hard for the community to help - version of Swagger Codegen - language (`-l` in the command line, e.g. java, csharp, php) - You can also make a suggestion or ask a question by opening an "issue" @@ -56,7 +56,7 @@ To start the CI tests, you can run `mvn verify -Psamples` (assuming you've all t ### Tips - Smaller changes are easier to review -- [Optional] For bug fixes, provide a Swagger spec to repeat the issue so that the reviewer can use it to confirm the fix +- [Optional] For bug fixes, provide a OpenAPI Spec to repeat the issue so that the reviewer can use it to confirm the fix - Add test case(s) to cover the change - Document the fix in the code to make the code more readable - Make sure test cases passed after the change (one way is to leverage https://travis-ci.org/ to run the CI tests) diff --git a/README.md b/README.md index 3f1691144b9a..eb5b11273c42 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ ## Overview This is the swagger codegen project, which allows generation of client libraries automatically from a Swagger-compliant server. -Check out [Swagger-Spec](https://github.com/swagger-api/swagger-spec) for additional information about the Swagger project, including additional libraries with support for other languages and more. +Check out [Swagger-Spec](https://github.com/OAI/OpenAPI-Specification) for additional information about the Swagger project, including additional libraries with support for other languages and more. # Table of contents @@ -32,7 +32,7 @@ Check out [Swagger-Spec](https://github.com/swagger-api/swagger-spec) for additi - [Where is Javascript???](#where-is-javascript) - [Generating a client from local files](#generating-a-client-from-local-files) - [Customizing the generator](#customizing-the-generator) - - [Validating your swagger spec](#validating-your-swagger-spec) + - [Validating your OpenAPI Spec](#validating-your-swagger-spec) - [Generating dynamic html api documentation](#generating-dynamic-html-api-documentation) - [Generating static html api documentation](#generating-static-html-api-documentation) - [To build a server stub](#to-build-a-server-stub) @@ -50,9 +50,9 @@ Check out [Swagger-Spec](https://github.com/swagger-api/swagger-spec) for additi ## Compatibility -The Swagger Specification has undergone 3 revisions since initial creation in 2010. The swagger-codegen project has the following compatibilies with the swagger specification: +The OpenAPI Specification has undergone 3 revisions since initial creation in 2010. The swagger-codegen project has the following compatibilies with the OpenAPI Specification: -Swagger Codegen Version | Release Date | Swagger Spec compatibility | Notes +Swagger Codegen Version | Release Date | OpenAPI Spec compatibility | Notes -------------------------- | ------------ | -------------------------- | ----- 2.1.5-SNAPSHOT | | 1.0, 1.1, 1.2, 2.0 | [master](https://github.com/swagger-api/swagger-codegen) 2.1.4 (**current stable**) | 2015-10-25 | 1.0, 1.1, 1.2, 2.0 | [tag v2.1.4](https://github.com/swagger-api/swagger-codegen/tree/v2.1.4) @@ -61,7 +61,20 @@ Swagger Codegen Version | Release Date | Swagger Spec compatibility | Notes ### Prerequisites -You need the following installed and available in your $PATH: +If you're looking for the latest stable version, you can grab it directly from maven central (you'll need the java 7 runtime): + +``` +wget http://repo1.maven.org/maven2/io/swagger/swagger-codegen-cli/2.1.4/swagger-codegen-cli-2.1.4.jar swagger-codegen-cli.jar + +java -jar swagger-codegen-cli.jar help +``` + +On a mac, it's even easier with `brew`: +``` +brew install swagger-codegen +``` + +To build from source, you need the following installed and available in your $PATH: * [Java 7](http://java.oracle.com) @@ -164,7 +177,7 @@ OPTIONS name=value,name=value -i , --input-spec - location of the swagger spec, as URL or file (required) + location of the OpenAPI Spec, as URL or file (required) -l , --lang client language to generate (maybe class name in classpath, @@ -235,12 +248,12 @@ java -cp output/myLibrary/target/myClientCodegen-swagger-codegen-1.0.0.jar:modul ### Where is Javascript??? See our [javascript library](http://github.com/swagger-api/swagger-js)--it's completely dynamic and doesn't require static code generation. -There is a third-party component called [swagger-js-codegen](https://github.com/wcandillon/swagger-js-codegen) that can generate angularjs or nodejs source code from a swagger specification. +There is a third-party component called [swagger-js-codegen](https://github.com/wcandillon/swagger-js-codegen) that can generate angularjs or nodejs source code from a OpenAPI Specification. :exclamation: On Dec 7th 2015, a Javascript API client generator has been added by @jfiala. ### Generating a client from local files -If you don't want to call your server, you can save the swagger spec files into a directory and pass an argument +If you don't want to call your server, you can save the OpenAPI Spec files into a directory and pass an argument to the code generator like this: ``` @@ -419,7 +432,25 @@ and specify the `classname` when running the generator: Your subclass will now be loaded and overrides the `PREFIX` value in the superclass. -### Validating your swagger spec +### Bringing your own models + +Sometimes you don't want a model generated. In this case, you can simply specify an import mapping to tell +the codegen what _not_ to create. When doing this, every location that references a specific model will +refer back to your classes. Note, this may not apply to all languages... + +To specify an import mapping, use the `--import-mappings` argument and specify the model-to-import logic as such: + +``` +--import-mappings Pet=my.models.MyPet +``` + +Or for multiple mappings: + +``` +Pet=my.models.MyPet,Order=my.models.MyOrder +``` + +### Validating your OpenAPI Spec You have options. The easiest is to use our [online validator](https://github.com/swagger-api/validator-badge) which not only will let you validate your spec, but with the debug flag, you can see what's wrong with your spec. For example: diff --git a/bin/all-petstore.sh b/bin/all-petstore.sh index f6156dbcee99..7db8c7ec9161 100755 --- a/bin/all-petstore.sh +++ b/bin/all-petstore.sh @@ -43,6 +43,7 @@ cd $APP_DIR ./bin/silex-petstore-server.sh ./bin/slim-petstore-server.sh ./bin/spring-mvc-petstore-server.sh +./bin/spring-mvc-petstore-j8-async-server.sh ./bin/swift-petstore.sh ./bin/tizen-petstore.sh ./bin/typescript-angular-petstore.sh diff --git a/bin/spring-mvc-petstore-j8-async-server.sh b/bin/spring-mvc-petstore-j8-async-server.sh new file mode 100755 index 000000000000..d43b0c432865 --- /dev/null +++ b/bin/spring-mvc-petstore-j8-async-server.sh @@ -0,0 +1,31 @@ +#!/bin/sh + +SCRIPT="$0" + +while [ -h "$SCRIPT" ] ; do + ls=`ls -ld "$SCRIPT"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + SCRIPT="$link" + else + SCRIPT=`dirname "$SCRIPT"`/"$link" + fi +done + +if [ ! -d "${APP_DIR}" ]; then + APP_DIR=`dirname "$SCRIPT"`/.. + APP_DIR=`cd "${APP_DIR}"; pwd` +fi + +executable="./modules/swagger-codegen-cli/target/swagger-codegen-cli.jar" + +if [ ! -f "$executable" ] +then + mvn clean package +fi + +# if you've executed sbt assembly previously it will use that instead. +export JAVA_OPTS="${JAVA_OPTS} -XX:MaxPermSize=256M -Xmx1024M -DloggerPath=conf/log4j.properties" +ags="$@ generate -t modules/swagger-codegen/src/main/resources/JavaSpringMVC -i modules/swagger-codegen/src/test/resources/2_0/petstore.json -l spring-mvc -o samples/server/petstore/spring-mvc-j8-async -c bin/spring-mvc-petstore-j8-async.json" + +java $JAVA_OPTS -jar $executable $ags diff --git a/bin/spring-mvc-petstore-j8-async.json b/bin/spring-mvc-petstore-j8-async.json new file mode 100644 index 000000000000..c19430ec9ab1 --- /dev/null +++ b/bin/spring-mvc-petstore-j8-async.json @@ -0,0 +1,3 @@ +{ + "library": "j8-async" +} diff --git a/config-feign.json b/config-feign.json deleted file mode 100644 index 3b8c48c3caa0..000000000000 --- a/config-feign.json +++ /dev/null @@ -1 +0,0 @@ -{"library":"feign"} \ No newline at end of file diff --git a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/SwaggerCodegen.java b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/SwaggerCodegen.java index 3cdc01fe3f5a..502e4d046bae 100644 --- a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/SwaggerCodegen.java +++ b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/SwaggerCodegen.java @@ -21,7 +21,7 @@ public class SwaggerCodegen { public static void main(String[] args) { - Cli.CliBuilder builder = Cli.builder("swagger") + Cli.CliBuilder builder = Cli.builder("swagger-codegen-cli") .withDescription("Swagger code generator CLI. More info on swagger.io") .withDefaultCommand(Langs.class) .withCommands( diff --git a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java index ca06652b942b..9843024b1043 100644 --- a/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java +++ b/modules/swagger-codegen-cli/src/main/java/io/swagger/codegen/cmd/Meta.java @@ -135,6 +135,7 @@ public class Meta implements Runnable { */ private Mustache.TemplateLoader loader(final DefaultGenerator generator) { return new Mustache.TemplateLoader() { + @Override public Reader getTemplate(String name) { return generator.getTemplateReader(TEMPLATE_DIR_CLASSPATH + File.separator + name.concat(MUSTACHE_EXTENSION)); diff --git a/modules/swagger-codegen-maven-plugin/README.md b/modules/swagger-codegen-maven-plugin/README.md index 372b2c90adf6..f42e9cc8778b 100644 --- a/modules/swagger-codegen-maven-plugin/README.md +++ b/modules/swagger-codegen-maven-plugin/README.md @@ -37,7 +37,7 @@ mvn clean compile ### General Configuration parameters -- `inputSpec` - swagger spec file path +- `inputSpec` - OpenAPI Spec file path - `language` - target generation language - `output` - target output path (default is `${project.build.directory}/generated-sources/swagger`) - `templateDirectory` - directory with mustache templates diff --git a/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/AdditionalParams.java b/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/AdditionalParams.java index f3678e783e09..7db012f439cd 100644 --- a/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/AdditionalParams.java +++ b/modules/swagger-codegen-maven-plugin/src/main/java/io/swagger/codegen/plugin/AdditionalParams.java @@ -10,7 +10,7 @@ public final class AdditionalParams { public static final String MODEL_PACKAGE_PARAM = "modelPackage"; public static final String API_PACKAGE_PARAM = "apiPackage"; public static final String INVOKER_PACKAGE_PARAM = "invokerPackage"; + public static final String LIBRARY_PARAM = "library"; - private AdditionalParams() { - } -} + private AdditionalParams() {} +} \ No newline at end of file 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 22726c84c046..50c9ce48f382 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 @@ -100,6 +100,12 @@ public class CodeGenMojo extends AbstractMojo { @Parameter(name = "configurationFile", required = false) private String configurationFile; + /** + * Sets the library + */ + @Parameter(name = "library", required = false) + private String library; + /** * A map of language-specific parameters as passed with the -c option to the command line */ @@ -139,7 +145,9 @@ public class CodeGenMojo extends AbstractMojo { System.setProperty(key, value); } } - + if (null != library) { + config.setLibrary(library); + } if (null != templateDirectory) { config.additionalProperties().put(TEMPLATE_DIR_PARAM, templateDirectory.getAbsolutePath()); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfig.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfig.java index c111a3af2fcb..a74e652bb6d8 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfig.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConfig.java @@ -109,6 +109,10 @@ public interface CodegenConfig { Map postProcessSupportingFileData(Map objs); + void postProcessModelProperty(CodegenModel model, CodegenProperty property); + + void postProcessParameter(CodegenParameter parameter); + String apiFilename(String templateName, String tag); boolean shouldOverwrite(String filename); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java index 4d0e64e19a45..c716aefee37f 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenConstants.java @@ -37,6 +37,9 @@ public class CodegenConstants { public static final String SERIALIZABLE_MODEL = "serializableModel"; public static final String SERIALIZABLE_MODEL_DESC = "boolean - toggle \"implements Serializable\" for generated models"; + public static final String SERIALIZE_BIG_DECIMAL_AS_STRING = "bigDecimalAsString"; + public static final String SERIALIZE_BIG_DECIMAL_AS_STRING_DESC = "boolean - treat BigDecimal values as Strings to avoid precision loss. Default: false"; + public static final String LIBRARY = "library"; public static final String LIBRARY_DESC = "library template (sub-template)"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java index 3e2ad6afb2cb..3713261f8f1d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenModel.java @@ -2,22 +2,22 @@ package io.swagger.codegen; import io.swagger.models.ExternalDocs; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class CodegenModel { public String parent; - public String name, classname, description, classVarName, modelJson; + public String name, classname, description, classVarName, modelJson, dataType; public String unescapedDescription; public String defaultValue; public List vars = new ArrayList(); - + public List allowableValues; + // list of all required parameters public Set mandatory = new HashSet(); - public Set imports = new HashSet(); - public Boolean hasVars, emptyVars, hasMoreModels, hasEnums; + public Set imports = new TreeSet(); + public Boolean hasVars, emptyVars, hasMoreModels, hasEnums, isEnum; public ExternalDocs externalDocs; + + public Map vendorExtensions; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java index 32e169ac8782..87352907ad0b 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/CodegenProperty.java @@ -31,13 +31,14 @@ public class CodegenProperty { public Double maximum; public Boolean exclusiveMinimum; public Boolean exclusiveMaximum; - public Boolean hasMore = null, required = null, secondaryParam = null; + public Boolean hasMore, required, secondaryParam; public Boolean isPrimitiveType, isContainer, isNotContainer; public boolean isEnum; public Boolean isReadOnly = false; public List _enum; public Map allowableValues; public CodegenProperty items; + public Map vendorExtensions; @Override public boolean equals(Object obj) { @@ -138,6 +139,9 @@ public class CodegenProperty { if (this.allowableValues != other.allowableValues && (this.allowableValues == null || !this.allowableValues.equals(other.allowableValues))) { return false; } + if (this.vendorExtensions != other.vendorExtensions && (this.vendorExtensions == null || !this.vendorExtensions.equals(other.vendorExtensions))) { + return false; + } return true; } } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 53c0e6350b0d..0aa9a2301aab 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -25,23 +25,8 @@ import io.swagger.models.parameters.Parameter; import io.swagger.models.parameters.PathParameter; import io.swagger.models.parameters.QueryParameter; import io.swagger.models.parameters.SerializableParameter; -import io.swagger.models.properties.AbstractNumericProperty; -import io.swagger.models.properties.ArrayProperty; -import io.swagger.models.properties.BooleanProperty; -import io.swagger.models.properties.ByteArrayProperty; -import io.swagger.models.properties.DateProperty; -import io.swagger.models.properties.DateTimeProperty; -import io.swagger.models.properties.DecimalProperty; -import io.swagger.models.properties.DoubleProperty; -import io.swagger.models.properties.FloatProperty; -import io.swagger.models.properties.IntegerProperty; -import io.swagger.models.properties.LongProperty; -import io.swagger.models.properties.MapProperty; -import io.swagger.models.properties.Property; -import io.swagger.models.properties.PropertyBuilder; +import io.swagger.models.properties.*; import io.swagger.models.properties.PropertyBuilder.PropertyId; -import io.swagger.models.properties.RefProperty; -import io.swagger.models.properties.StringProperty; import io.swagger.util.Json; import org.apache.commons.lang.StringUtils; @@ -86,9 +71,9 @@ public class DefaultCodegen { protected List supportingFiles = new ArrayList(); protected List cliOptions = new ArrayList(); protected boolean skipOverwrite; - protected boolean supportsInheritance = false; + protected boolean supportsInheritance; protected Map supportedLibraries = new LinkedHashMap(); - protected String library = null; + protected String library; protected Boolean sortParamsByRequiredFlag = true; protected Boolean ensureUniqueParams = true; @@ -135,6 +120,12 @@ public class DefaultCodegen { return objs; } + // override to post-process any model properties + public void postProcessModelProperty(CodegenModel model, CodegenProperty property){} + + // override to post-process any parameters + public void postProcessParameter(CodegenParameter parameter){} + //override with any special handling of the entire swagger spec public void preprocessSwagger(Swagger swagger) { } @@ -148,6 +139,7 @@ public class DefaultCodegen { if (input != null) { input = input.trim(); String output = input.replaceAll("\n", "\\\\n"); + output = output.replace("\r", "\\r"); output = output.replace("\"", "\\\""); return output; } @@ -322,7 +314,7 @@ public class DefaultCodegen { * Return the parameter name by removing invalid characters and proper escaping if * it's a reserved word. * - * @param property Codegen property object + * @param name Codegen property object * @return the sanitized parameter name */ public String toParamName(String name) { @@ -347,8 +339,9 @@ public class DefaultCodegen { * Return the escaped name of the reserved word * * @param name the name to be escaped - * @throws Runtime exception as reserved word is not allowed (default behavior) * @return the escaped reserved word + * + * throws Runtime exception as reserved word is not allowed (default behavior) */ public String escapeReservedWord(String name) { throw new RuntimeException("reserved word " + name + " not allowed"); @@ -384,9 +377,8 @@ public class DefaultCodegen { * between Swagger type and the corresponding import statement for the language. This will * also add some language specified CLI options, if any. * - * @param path the path of the operation - * @param operation Swagger operation object - * @return string presentation of the example path + * + * returns string presentation of the example path (it's a constructor) */ public DefaultCodegen() { defaultIncludes = new HashSet( @@ -423,6 +415,7 @@ public class DefaultCodegen { typeMapping.put("object", "Object"); typeMapping.put("integer", "Integer"); typeMapping.put("ByteArray", "byte[]"); + typeMapping.put("binary", "byte[]"); instantiationTypes = new HashMap(); @@ -447,9 +440,10 @@ public class DefaultCodegen { importMapping.put("LocalTime", "org.joda.time.*"); cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, - CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC).defaultValue("true")); - cliOptions.add(new CliOption(CodegenConstants.ENSURE_UNIQUE_PARAMS, CodegenConstants.ENSURE_UNIQUE_PARAMS_DESC) - .defaultValue("true")); + CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC, BooleanProperty.TYPE) + .defaultValue(Boolean.TRUE.toString())); + cliOptions.add(new CliOption(CodegenConstants.ENSURE_UNIQUE_PARAMS, CodegenConstants.ENSURE_UNIQUE_PARAMS_DESC, + BooleanProperty.TYPE).defaultValue(Boolean.TRUE.toString())); } /** @@ -632,10 +626,14 @@ public class DefaultCodegen { **/ public String getSwaggerType(Property p) { String datatype = null; - if (p instanceof StringProperty) { + if (p instanceof StringProperty && "number".equals(p.getFormat())) { + datatype = "BigDecimal"; + } else if (p instanceof StringProperty) { datatype = "string"; } else if (p instanceof ByteArrayProperty) { datatype = "ByteArray"; + } else if (p instanceof BinaryProperty) { + datatype = "binary"; } else if (p instanceof BooleanProperty) { datatype = "boolean"; } else if (p instanceof DateProperty) { @@ -774,6 +772,9 @@ public class DefaultCodegen { m.classVarName = toVarName(name); m.modelJson = Json.pretty(model); m.externalDocs = model.getExternalDocs(); + m.vendorExtensions = model.getVendorExtensions(); + + if (model instanceof ArrayModel) { ArrayModel am = (ArrayModel) model; ArrayProperty arrayProperty = new ArrayProperty(am.getItems()); @@ -838,12 +839,24 @@ public class DefaultCodegen { addVars(m, properties, required); } else { ModelImpl impl = (ModelImpl) model; + if(impl.getEnum() != null && impl.getEnum().size() > 0) { + m.isEnum = true; + m.allowableValues = impl.getEnum(); + Property p = PropertyBuilder.build(impl.getType(), impl.getFormat(), null); + m.dataType = getSwaggerType(p); + } if (impl.getAdditionalProperties() != null) { MapProperty mapProperty = new MapProperty(impl.getAdditionalProperties()); addParentContainer(m, name, mapProperty); } addVars(m, impl.getProperties(), impl.getRequired()); } + + if(m.vars != null) { + for(CodegenProperty prop : m.vars) { + postProcessModelProperty(m, prop); + } + } return m; } @@ -886,9 +899,9 @@ public class DefaultCodegen { property.example = p.getExample(); property.defaultValue = toDefaultValue(p); property.defaultValueWithParam = toDefaultValueWithParam(name, p); - property.jsonSchema = Json.pretty(p); property.isReadOnly = p.getReadOnly(); + property.vendorExtensions = p.getVendorExtensions(); String type = getSwaggerType(p); if (p instanceof AbstractNumericProperty) { @@ -1433,7 +1446,7 @@ public class DefaultCodegen { * Convert Swagger Parameter object to Codegen Parameter object * * @param param Swagger parameter object - * @param a set of imports for library/package/module + * @param imports set of imports for library/package/module * @return Codegen Parameter object */ public CodegenParameter fromParameter(Parameter param, Set imports) { @@ -1596,6 +1609,8 @@ public class DefaultCodegen { } p.paramName = toParamName(bp.getName()); } + + postProcessParameter(p); return p; } @@ -1607,7 +1622,7 @@ public class DefaultCodegen { */ public List fromSecurity(Map schemes) { if (schemes == null) { - return null; + return Collections.emptyList(); } List secs = new ArrayList(schemes.size()); @@ -1708,8 +1723,7 @@ public class DefaultCodegen { */ protected boolean needToImport(String type) { return !defaultIncludes.contains(type) - && !languageSpecificPrimitives.contains(type) - && type.indexOf(".") < 0; + && !languageSpecificPrimitives.contains(type); } protected List> toExamples(Map examples) { @@ -1823,6 +1837,16 @@ public class DefaultCodegen { return word; } + /** + * Dashize the given word. + * + * @param word The word + * @return The dashized version of the word, e.g. "my-name" + */ + protected String dashize(String word) { + return underscore(word).replaceAll("[_ ]", "-"); + } + /** * Generate the next name for the given name, i.e. append "2" to the base name if not ending with a number, * otherwise increase the number by 1. For example: @@ -2009,6 +2033,7 @@ public class DefaultCodegen { /** * All library templates supported. * (key: library name, value: library description) + * @return the supported libraries */ public Map supportedLibraries() { return supportedLibraries; 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 3623361387ed..79b07f2427bd 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 @@ -22,8 +22,8 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { Logger LOGGER = LoggerFactory.getLogger(DefaultGenerator.class); protected CodegenConfig config; - protected ClientOptInput opts = null; - protected Swagger swagger = null; + protected ClientOptInput opts; + protected Swagger swagger; @Override public Generator opts(ClientOptInput opts) { @@ -563,7 +563,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { Map authMethods = new HashMap(); // NOTE: Use only the first security requirement for now. // See the "security" field of "Swagger Object": - // https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#swagger-object + // https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#swagger-object // "there is a logical OR between the security requirements" if (securities.size() > 1) { LOGGER.warn("More than 1 security requirements are found, using only the first one"); @@ -697,29 +697,35 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { mo.put("model", cm); mo.put("importPath", config.toModelImport(key)); models.add(mo); + allImports.addAll(cm.imports); } objs.put("models", models); - List> imports = new ArrayList>(); + Set importSet = new TreeSet(); for (String nextImport : allImports) { - Map im = new LinkedHashMap(); + Map im = new HashMap(); String mapping = config.importMapping().get(nextImport); if (mapping == null) { mapping = config.toModelImport(nextImport); } if (mapping != null && !config.defaultIncludes().contains(mapping)) { - im.put("import", mapping); - imports.add(im); + importSet.add(mapping); } // add instantiation types mapping = config.instantiationTypes().get(nextImport); if (mapping != null && !config.defaultIncludes().contains(mapping)) { - im.put("import", mapping); - imports.add(im); + importSet.add(mapping); } } + List> imports = new ArrayList>(); + for(String s: importSet) { + Map item = new HashMap(); + item.put("import", s); + imports.add(item); + } + objs.put("imports", imports); config.postProcessModels(objs); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java index f727560210ad..2e698162182d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/InlineModelResolver.java @@ -13,9 +13,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class InlineModelResolver { - private Swagger swagger = null; - private boolean skipMatches = false; + private Swagger swagger; + private boolean skipMatches; + static Logger LOGGER = LoggerFactory.getLogger(InlineModelResolver.class); Map addedModels = new HashMap(); Map generatedSignature = new HashMap(); @@ -60,8 +64,19 @@ public class InlineModelResolver { Property inner = am.getItems(); if(inner instanceof ObjectProperty) { + String modelName = uniqueName(bp.getName()); ObjectProperty op = (ObjectProperty) inner; flattenProperties(op.getProperties(), pathname); + + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + if (existing != null) { + am.setItems(new RefProperty(existing)); + } else { + am.setItems(new RefProperty(modelName)); + addGenerated(modelName, innerModel); + swagger.addDefinition(modelName, innerModel); + } } } } @@ -88,36 +103,38 @@ public class InlineModelResolver { } } else if (property instanceof ArrayProperty) { ArrayProperty ap = (ArrayProperty) property; - if(ap.getItems() instanceof ObjectProperty) { - ObjectProperty op = (ObjectProperty) ap.getItems(); - Map props = op.getProperties(); - flattenProperties(props, "path"); - } - } else if (property instanceof MapProperty) { - MapProperty op = (MapProperty) property; - - Property innerProperty = op.getAdditionalProperties(); - if(innerProperty instanceof ObjectProperty) { - ModelImpl innerModel = new ModelImpl(); - // TODO: model props - innerModel.setTitle(property.getTitle()); - property.getVendorExtensions(); - property.getRequired(); - property.getReadOnly(); - property.getAccess(); - innerModel.setDescription(property.getDescription()); - innerModel.setExample(property.getExample()); - innerModel.setName(property.getName()); - innerModel.setXml(property.getXml()); - - innerModel.setAdditionalProperties(innerProperty); + Property inner = ap.getItems(); + if(inner instanceof ObjectProperty) { String modelName = uniqueName("inline_response_" + key); + ObjectProperty op = (ObjectProperty) inner; + flattenProperties(op.getProperties(), pathname); + + Model innerModel = modelFromProperty(op, modelName); String existing = matchGenerated(innerModel); if (existing != null) { - response.setSchema(new RefProperty(existing)); + ap.setItems(new RefProperty(existing)); } else { - response.setSchema(new RefProperty(modelName)); + ap.setItems(new RefProperty(modelName)); + addGenerated(modelName, innerModel); + swagger.addDefinition(modelName, innerModel); + } + } + } else if (property instanceof MapProperty) { + MapProperty mp = (MapProperty) property; + + Property innerProperty = mp.getAdditionalProperties(); + if(innerProperty instanceof ObjectProperty) { + String modelName = uniqueName("inline_response_" + key); + ObjectProperty op = (ObjectProperty) innerProperty; + flattenProperties(op.getProperties(), pathname); + + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + if (existing != null) { + mp.setAdditionalProperties(new RefProperty(existing)); + } else { + mp.setAdditionalProperties(new RefProperty(modelName)); addGenerated(modelName, innerModel); swagger.addDefinition(modelName, innerModel); } @@ -222,6 +239,49 @@ public class InlineModelResolver { addGenerated(modelName, model); swagger.addDefinition(modelName, model); } + } else if (property instanceof ArrayProperty) { + ArrayProperty ap = (ArrayProperty) property; + Property inner = ap.getItems(); + + if (inner instanceof ObjectProperty) { + String modelName = uniqueName(path + "_" + key); + + ObjectProperty op = (ObjectProperty) inner; + flattenProperties(op.getProperties(), path); + + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + + if (existing != null) { + ap.setItems(new RefProperty(existing)); + } else { + ap.setItems(new RefProperty(modelName)); + addGenerated(modelName, innerModel); + swagger.addDefinition(modelName, innerModel); + } + } + } else if (property instanceof MapProperty) { + MapProperty mp = (MapProperty) property; + Property inner = mp.getAdditionalProperties(); + + if (inner instanceof ObjectProperty) { + String modelName = uniqueName(path + "_" + key); + + ObjectProperty op = (ObjectProperty) inner; + flattenProperties(op.getProperties(), path); + + Model innerModel = modelFromProperty(op, modelName); + String existing = matchGenerated(innerModel); + + if (existing != null) { + mp.setAdditionalProperties(new RefProperty(existing)); + } else { + mp.setAdditionalProperties(new RefProperty(modelName)); + addGenerated(modelName, innerModel); + swagger.addDefinition(modelName, innerModel); + } + } + } else { } } if (propsToUpdate.size() > 0) { @@ -325,4 +385,5 @@ public class InlineModelResolver { public void setSkipMatches(boolean skipMatches) { this.skipMatches = skipMatches; } + } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/MetaGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/MetaGenerator.java index 8c8308471ffc..818edab02147 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/MetaGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/MetaGenerator.java @@ -157,6 +157,7 @@ public class MetaGenerator extends AbstractGenerator { String template = readTemplate(templateDir + File.separator + support.templateFile); Template tmpl = Mustache.compiler() .withLoader(new Mustache.TemplateLoader() { + @Override public Reader getTemplate(String name) { return getTemplateReader(templateDir + File.separator + name + ".mustache"); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java index ad892917c701..8771d10aebe4 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/config/CodegenConfigurator.java @@ -41,8 +41,8 @@ public class CodegenConfigurator { private String lang; private String inputSpec; private String outputDir; - private boolean verbose = false; - private boolean skipOverwrite = false; + private boolean verbose; + private boolean skipOverwrite; private String templateDir; private String auth; private String apiPackage; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractTypeScriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractTypeScriptClientCodegen.java index a8d664918518..0147b47cca36 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractTypeScriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AbstractTypeScriptClientCodegen.java @@ -60,6 +60,7 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegen imp return outputFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AkkaScalaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AkkaScalaClientCodegen.java index 29732f1d45ad..aa5d314184b4 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AkkaScalaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AkkaScalaClientCodegen.java @@ -154,14 +154,17 @@ public class AkkaScalaClientCodegen extends DefaultCodegen implements CodegenCon cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC)); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "akka-scala"; } + @Override public String getHelp() { return "Generates a Scala client library base on Akka/Spray."; } @@ -176,6 +179,7 @@ public class AkkaScalaClientCodegen extends DefaultCodegen implements CodegenCon return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } @@ -321,6 +325,7 @@ public class AkkaScalaClientCodegen extends DefaultCodegen implements CodegenCon } } + @Override public String toDefaultValue(Property p) { if (!p.getRequired()) { return "None"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AndroidClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AndroidClientCodegen.java index 7983d83cea15..636739c6b642 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AndroidClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AndroidClientCodegen.java @@ -7,6 +7,7 @@ import io.swagger.codegen.CodegenType; import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.BooleanProperty; import io.swagger.models.properties.MapProperty; import io.swagger.models.properties.Property; @@ -67,18 +68,21 @@ public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfi cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_ID, "artifactId for use in the generated build.gradle and pom.xml")); cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_VERSION, "artifact version for use in the generated build.gradle and pom.xml")); cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC)); - cliOptions.add(new CliOption(USE_ANDROID_MAVEN_GRADLE_PLUGIN, "A flag to toggle android-maven gradle plugin.") - .defaultValue("true")); + cliOptions.add(new CliOption(USE_ANDROID_MAVEN_GRADLE_PLUGIN, "A flag to toggle android-maven gradle plugin.", + BooleanProperty.TYPE).defaultValue(Boolean.TRUE.toString())); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "android"; } + @Override public String getHelp() { return "Generates an Android client library."; } @@ -93,6 +97,7 @@ public class AndroidClientCodegen extends DefaultCodegen implements CodegenConfi return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AsyncScalaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AsyncScalaClientCodegen.java index 5e85712ffcd6..310b4788dd08 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AsyncScalaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/AsyncScalaClientCodegen.java @@ -33,7 +33,7 @@ public class AsyncScalaClientCodegen extends DefaultCodegen implements CodegenCo protected String sourceFolder = "src/main/scala"; protected String clientName = "SwaggerClient"; protected String authScheme = ""; - protected boolean authPreemptive = false; + protected boolean authPreemptive; protected boolean asyncHttpClient = !authScheme.isEmpty(); public AsyncScalaClientCodegen() { @@ -111,14 +111,17 @@ public class AsyncScalaClientCodegen extends DefaultCodegen implements CodegenCo cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC)); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "async-scala"; } + @Override public String getHelp() { return "Generates an Asynchronous Scala client library."; } @@ -133,6 +136,7 @@ public class AsyncScalaClientCodegen extends DefaultCodegen implements CodegenCo return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } @@ -182,6 +186,7 @@ public class AsyncScalaClientCodegen extends DefaultCodegen implements CodegenCo } } + @Override public String toDefaultValue(Property p) { if (p instanceof StringProperty) { return "null"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java index f69ddd16d351..5a1d1b9598bd 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CSharpClientCodegen.java @@ -89,8 +89,11 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig cliOptions.add(new CliOption(CodegenConstants.PACKAGE_NAME, "C# package name (convention: Camel.Case).") .defaultValue("IO.Swagger")); cliOptions.add(new CliOption(CodegenConstants.PACKAGE_VERSION, "C# package version.").defaultValue("1.0.0")); - cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC)); - cliOptions.add(new CliOption(CodegenConstants.OPTIONAL_METHOD_ARGUMENT, "C# Optional method argument, e.g. void square(int x=10) (.net 4.0+ only). Default: false").defaultValue("false")); + cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, + CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC, BooleanProperty.TYPE)); + cliOptions.add(new CliOption(CodegenConstants.OPTIONAL_METHOD_ARGUMENT, "C# Optional method argument, " + + "e.g. void square(int x=10) (.net 4.0+ only).", BooleanProperty.TYPE) + .defaultValue(Boolean.FALSE.toString())); } @Override @@ -135,14 +138,17 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "csharp"; } + @Override public String getHelp() { return "Generates a CSharp client library."; } @@ -157,6 +163,7 @@ public class CSharpClientCodegen extends DefaultCodegen implements CodegenConfig return outputFolder + File.separator + sourceFolder + File.separator + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + File.separator + sourceFolder + File.separator + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java index a850785a7dbb..d4a8ada06b97 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ClojureClientCodegen.java @@ -26,10 +26,10 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi private static final String PROJECT_LICENSE_URL = "projectLicenseUrl"; private static final String BASE_NAMESPACE = "baseNamespace"; - protected String projectName = null; - protected String projectDescription = null; - protected String projectVersion = null; - protected String baseNamespace = null; + protected String projectName; + protected String projectDescription; + protected String projectVersion; + protected String baseNamespace; protected String sourceFolder = "src"; @@ -199,8 +199,4 @@ public class ClojureClientCodegen extends DefaultCodegen implements CodegenConfi protected String namespaceToFolder(String ns) { return ns.replace(".", File.separator).replace("-", "_"); } - - protected String dashize(String s) { - return underscore(s).replaceAll("[_ ]", "-"); - } } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CsharpDotNet2ClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CsharpDotNet2ClientCodegen.java index 7b6bf5e78445..f3ae3b6a4d81 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CsharpDotNet2ClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/CsharpDotNet2ClientCodegen.java @@ -135,14 +135,17 @@ public class CsharpDotNet2ClientCodegen extends DefaultCodegen implements Codege this.packageVersion = packageVersion; } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "CsharpDotNet2"; } + @Override public String getHelp() { return "Generates a C# .Net 2.0 client library."; } @@ -157,6 +160,7 @@ public class CsharpDotNet2ClientCodegen extends DefaultCodegen implements Codege return outputFolder + File.separator + sourceFolder + File.separator + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + File.separator + sourceFolder + File.separator + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/DartClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/DartClientCodegen.java index e18b9eac0a22..7d11f2a81838 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/DartClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/DartClientCodegen.java @@ -84,14 +84,17 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, "source folder for generated code")); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "dart"; } + @Override public String getHelp() { return "Generates a Dart client library."; } @@ -157,6 +160,7 @@ public class DartClientCodegen extends DefaultCodegen implements CodegenConfig { return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java index 8608cbe8924c..dac3d23b22ac 100755 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlashClientCodegen.java @@ -26,7 +26,7 @@ import java.util.HashSet; public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig { protected String packageName = "io.swagger"; - protected String packageVersion = null; + protected String packageVersion; protected String invokerPackage = "io.swagger"; protected String sourceFolder = "src/main/flex"; @@ -156,14 +156,17 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig return str.replaceAll("\\.", "_"); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "flash"; } + @Override public String getHelp() { return "Generates a Flash client library."; } @@ -179,6 +182,7 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig + apiPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); } + @Override public String modelFileFolder() { return (outputFolder + File.separatorChar + sourceFolder + File.separatorChar + modelPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar); @@ -214,6 +218,7 @@ public class FlashClientCodegen extends DefaultCodegen implements CodegenConfig return type; } + @Override public String toDefaultValue(Property p) { if (p instanceof StringProperty) { return "null"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java index 7a06ee8b845f..483e841d7355 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/FlaskConnexionCodegen.java @@ -132,6 +132,7 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf } } + @Override public String apiPackage() { return controllerPackage; } @@ -142,6 +143,7 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf * @return the CodegenType for this generator * @see io.swagger.codegen.CodegenType */ + @Override public CodegenType getTag() { return CodegenType.SERVER; } @@ -152,6 +154,7 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf * * @return the friendly name for the generator */ + @Override public String getName() { return "python-flask"; } @@ -162,6 +165,7 @@ public class FlaskConnexionCodegen extends DefaultCodegen implements CodegenConf * * @return A string value for the help message */ + @Override public String getHelp() { return "Generates a python server library using the connexion project. By default, " + "it will also generate service classes--which you can disable with the `-Dnoservice` environment variable."; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JMeterCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JMeterCodegen.java index fb1674772146..429d992b7ef8 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JMeterCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JMeterCodegen.java @@ -22,6 +22,7 @@ public class JMeterCodegen extends DefaultCodegen implements CodegenConfig { * @return the CodegenType for this generator * @see io.swagger.codegen.CodegenType */ + @Override public CodegenType getTag() { return CodegenType.CLIENT; } @@ -32,6 +33,7 @@ public class JMeterCodegen extends DefaultCodegen implements CodegenConfig { * * @return the friendly name for the generator */ + @Override public String getName() { return "jmeter"; } @@ -42,6 +44,7 @@ public class JMeterCodegen extends DefaultCodegen implements CodegenConfig { * * @return A string value for the help message */ + @Override public String getHelp() { return "Generates a JMeter .jmx file."; } @@ -97,6 +100,7 @@ public class JMeterCodegen extends DefaultCodegen implements CodegenConfig { // supportingFiles.add(new SupportingFile("testdata-localhost.mustache", "input", "testdata-localhost.csv")); } + @Override public void preprocessSwagger(Swagger swagger) { if (swagger != null && swagger.getPaths() != null) { for (String pathname : swagger.getPaths().keySet()) { @@ -126,6 +130,7 @@ public class JMeterCodegen extends DefaultCodegen implements CodegenConfig { * Location to write model files. You can use the modelPackage() as defined when the class is * instantiated */ + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java index 1c03e6c9e6fd..44eb67d3c743 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaClientCodegen.java @@ -1,45 +1,21 @@ package io.swagger.codegen.languages; import com.google.common.base.Strings; -import io.swagger.codegen.CliOption; -import io.swagger.codegen.CodegenConfig; -import io.swagger.codegen.CodegenConstants; -import io.swagger.codegen.CodegenModel; -import io.swagger.codegen.CodegenOperation; -import io.swagger.codegen.CodegenProperty; -import io.swagger.codegen.CodegenType; -import io.swagger.codegen.DefaultCodegen; -import io.swagger.codegen.SupportingFile; +import io.swagger.codegen.*; import io.swagger.models.Model; import io.swagger.models.Operation; import io.swagger.models.Path; import io.swagger.models.Swagger; -import io.swagger.models.parameters.BodyParameter; import io.swagger.models.parameters.FormParameter; import io.swagger.models.parameters.Parameter; -import io.swagger.models.properties.ArrayProperty; -import io.swagger.models.properties.BooleanProperty; -import io.swagger.models.properties.DoubleProperty; -import io.swagger.models.properties.FloatProperty; -import io.swagger.models.properties.IntegerProperty; -import io.swagger.models.properties.LongProperty; -import io.swagger.models.properties.MapProperty; -import io.swagger.models.properties.Property; -import io.swagger.models.properties.StringProperty; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - +import io.swagger.models.properties.*; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; +import java.util.*; + public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(JavaClientCodegen.class); public static final String FULL_JAVA_UTIL = "fullJavaUtil"; @@ -52,9 +28,10 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { protected String projectFolder = "src" + File.separator + "main"; protected String sourceFolder = projectFolder + File.separator + "java"; protected String localVariablePrefix = ""; - protected boolean fullJavaUtil = false; + protected boolean fullJavaUtil; protected String javaUtilPrefix = ""; protected Boolean serializableModel = false; + protected boolean serializeBigDecimalAsString = false; public JavaClientCodegen() { super(); @@ -99,9 +76,12 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_VERSION, CodegenConstants.ARTIFACT_VERSION_DESC)); cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC)); cliOptions.add(new CliOption(CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC)); - cliOptions.add(new CliOption(CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC)); - cliOptions.add(new CliOption(FULL_JAVA_UTIL, "whether to use fully qualified name for classes under java.util") - .defaultValue("false")); + cliOptions.add(new CliOption(CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC, + BooleanProperty.TYPE)); + cliOptions.add(new CliOption(CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING, CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING_DESC, + BooleanProperty.TYPE)); + cliOptions.add(new CliOption(FULL_JAVA_UTIL, "whether to use fully qualified name for classes under java.util", + BooleanProperty.TYPE).defaultValue(Boolean.FALSE.toString())); supportedLibraries.put(DEFAULT_LIBRARY, "HTTP client: Jersey client 1.18. JSON processing: Jackson 2.4.2"); supportedLibraries.put("feign", "HTTP client: Netflix Feign 8.1.1"); @@ -167,7 +147,6 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { this.setSourceFolder((String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER)); } - if (additionalProperties.containsKey(CodegenConstants.LOCAL_VARIABLE_PREFIX)) { this.setLocalVariablePrefix((String) additionalProperties.get(CodegenConstants.LOCAL_VARIABLE_PREFIX)); } @@ -180,6 +159,10 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { this.setLibrary((String) additionalProperties.get(CodegenConstants.LIBRARY)); } + if(additionalProperties.containsKey(CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING)) { + this.setSerializeBigDecimalAsString(Boolean.valueOf(additionalProperties.get(CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING).toString())); + } + // need to put back serializableModel (boolean) into additionalProperties as value in additionalProperties is string additionalProperties.put(CodegenConstants.SERIALIZABLE_MODEL, serializableModel); @@ -211,6 +194,19 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { this.sanitizeConfig(); + + // optional jackson mappings for BigDecimal support + importMapping.put("ToStringSerializer", "com.fasterxml.jackson.databind.ser.std.ToStringSerializer"); + importMapping.put("JsonSerialize", "com.fasterxml.jackson.databind.annotation.JsonSerialize"); + + // imports for pojos + importMapping.put("ApiModelProperty", "io.swagger.annotations.ApiModelProperty"); + importMapping.put("ApiModel", "io.swagger.annotations.ApiModel"); + importMapping.put("JsonProperty", "com.fasterxml.jackson.annotation.JsonProperty"); + importMapping.put("JsonValue", "com.fasterxml.jackson.annotation.JsonValue"); + importMapping.put("Objects", "java.util.Objects"); + importMapping.put("StringUtil", invokerPackage + ".StringUtil"); + final String invokerFolder = (sourceFolder + '/' + invokerPackage).replace(".", "/"); supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); @@ -470,6 +466,38 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { return codegenModel; } + @Override + public void postProcessModelProperty(CodegenModel model, CodegenProperty property) { + if(serializeBigDecimalAsString) { + if (property.baseType.equals("BigDecimal")) { + // we serialize BigDecimal as `string` to avoid precision loss + property.vendorExtensions.put("extraAnnotation", "@JsonSerialize(using = ToStringSerializer.class)"); + + // this requires some more imports to be added for this model... + model.imports.add("ToStringSerializer"); + model.imports.add("JsonSerialize"); + } + } + if(model.isEnum == null || model.isEnum) { + // needed by all pojos, but not enums + model.imports.add("ApiModelProperty"); + model.imports.add("ApiModel"); + model.imports.add("JsonProperty"); + model.imports.add("Objects"); + model.imports.add("StringUtil"); + + if(model.hasEnums != null || model.hasEnums == true) { + model.imports.add("JsonValue"); + } + } + return; + } + + @Override + public void postProcessParameter(CodegenParameter parameter) { + return; + } + @Override public Map postProcessModels(Map objs) { List models = (List) objs.get("models"); @@ -530,6 +558,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { return objs; } + @Override public Map postProcessOperations(Map objs) { if("retrofit".equals(getLibrary()) || "retrofit2".equals(getLibrary())) { Map operations = (Map) objs.get("operations"); @@ -555,6 +584,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { return objs; } + @Override public void preprocessSwagger(Swagger swagger) { if (swagger != null && swagger.getPaths() != null) { for (String pathname : swagger.getPaths().keySet()) { @@ -606,6 +636,7 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { return accepts; } + @Override protected boolean needToImport(String type) { return super.needToImport(type) && type.indexOf(".") < 0; } @@ -698,6 +729,9 @@ public class JavaClientCodegen extends DefaultCodegen implements CodegenConfig { this.localVariablePrefix = localVariablePrefix; } + public void setSerializeBigDecimalAsString(boolean s) { + this.serializeBigDecimalAsString = s; + } public Boolean getSerializableModel() { return serializableModel; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java index a7a0420d9846..01ca02f185d9 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavaInflectorServerCodegen.java @@ -45,14 +45,17 @@ public class JavaInflectorServerCodegen extends JavaClientCodegen implements Cod ); } + @Override public CodegenType getTag() { return CodegenType.SERVER; } + @Override public String getName() { return "inflector"; } + @Override public String getHelp() { return "Generates a Java Inflector Server application."; } @@ -70,6 +73,8 @@ public class JavaInflectorServerCodegen extends JavaClientCodegen implements Cod "src/main/swagger", "swagger.yaml") ); + supportingFiles.add(new SupportingFile("StringUtil.mustache", + (sourceFolder + '/' + invokerPackage).replace(".", "/"), "StringUtil.java")); } @Override @@ -116,21 +121,6 @@ public class JavaInflectorServerCodegen extends JavaClientCodegen implements Cod } @Override - public Map postProcessModels(Map objs) { - List models = (List) objs.get("models"); - for (Object _mo : models) { - Map mo = (Map) _mo; - CodegenModel cm = (CodegenModel) mo.get("model"); - for (CodegenProperty var : cm.vars) { - // handle default value for enum, e.g. available => StatusEnum.available - if (var.isEnum && var.defaultValue != null && !"null".equals(var.defaultValue)) { - var.defaultValue = var.datatypeWithEnum + "." + var.defaultValue; - } - } - } - return objs; - } - public Map postProcessOperations(Map objs) { Map operations = (Map) objs.get("operations"); if (operations != null) { @@ -188,6 +178,7 @@ public class JavaInflectorServerCodegen extends JavaClientCodegen implements Cod return camelize(name)+ "Controller"; } + @Override public boolean shouldOverwrite(String filename) { return super.shouldOverwrite(filename); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java index 51ef135ae0dc..ac680d594632 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JavascriptClientCodegen.java @@ -11,7 +11,7 @@ import io.swagger.codegen.CodegenProperty; import io.swagger.codegen.CodegenType; import io.swagger.codegen.DefaultCodegen; import io.swagger.codegen.SupportingFile; -import io.swagger.models.Model; +import io.swagger.models.*; import io.swagger.models.properties.ArrayProperty; import io.swagger.models.properties.LongProperty; import io.swagger.models.properties.MapProperty; @@ -34,15 +34,19 @@ import org.slf4j.LoggerFactory; public class JavascriptClientCodegen extends DefaultCodegen implements CodegenConfig { private static final Logger LOGGER = LoggerFactory.getLogger(JavascriptClientCodegen.class); - protected String invokerPackage = "io.swagger.client"; - protected String groupId = "io.swagger"; - protected String artifactId = "swagger-java-client"; - protected String artifactVersion = "1.0.0"; + private static final String PROJECT_NAME = "projectName"; + private static final String MODULE_NAME = "moduleName"; + private static final String PROJECT_DESCRIPTION = "projectDescription"; + private static final String PROJECT_VERSION = "projectVersion"; + private static final String PROJECT_LICENSE_NAME = "projectLicenseName"; + + protected String projectName; + protected String moduleName; + protected String projectDescription; + protected String projectVersion; + protected String sourceFolder = "src"; protected String localVariablePrefix = ""; - protected boolean fullJavaUtil = false; - protected String javaUtilPrefix = ""; - protected Boolean serializableModel = false; public JavascriptClientCodegen() { super(); @@ -50,44 +54,48 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo modelTemplateFiles.put("model.mustache", ".js"); apiTemplateFiles.put("api.mustache", ".js"); templateDir = "Javascript"; - apiPackage = "scripts/rest/api"; - modelPackage = "scripts/rest/model"; + apiPackage = "api"; + modelPackage = "model"; + // reference: http://www.w3schools.com/js/js_reserved.asp reservedWords = new HashSet( Arrays.asList( - "abstract", "continue", "for", "new", "switch", "assert", - "default", "if", "package", "synchronized", "boolean", "do", "goto", "private", - "this", "break", "double", "implements", "protected", "throw", "byte", "else", - "import", "public", "throws", "case", "enum", "instanceof", "return", "transient", - "catch", "extends", "int", "short", "try", "char", "final", "interface", "static", - "void", "class", "finally", "long", "strictfp", "volatile", "const", "float", - "native", "super", "while") + "abstract", "arguments", "boolean", "break", "byte", + "case", "catch", "char", "class", "const", + "continue", "debugger", "default", "delete", "do", + "double", "else", "enum", "eval", "export", + "extends", "false", "final", "finally", "float", + "for", "function", "goto", "if", "implements", + "import", "in", "instanceof", "int", "interface", + "let", "long", "native", "new", "null", + "package", "private", "protected", "public", "return", + "short", "static", "super", "switch", "synchronized", + "this", "throw", "throws", "transient", "true", + "try", "typeof", "var", "void", "volatile", + "while", "with", "yield", + "Array", "Date", "eval", "function", "hasOwnProperty", + "Infinity", "isFinite", "isNaN", "isPrototypeOf", + "Math", "NaN", "Number", "Object", + "prototype", "String", "toString", "undefined", "valueOf") ); languageSpecificPrimitives = new HashSet( - Arrays.asList( - "String", - "boolean", - "Boolean", - "Double", - "Integer", - "Long", - "Float", - "Object", - "byte[]") + Arrays.asList("String", "Boolean", "Integer", "Number", "Array", "Object", "Date", "File") ); - instantiationTypes.put("array", "Array"); - instantiationTypes.put("map", "HashMap"); + defaultIncludes = new HashSet(languageSpecificPrimitives); - cliOptions.add(new CliOption(CodegenConstants.INVOKER_PACKAGE, CodegenConstants.INVOKER_PACKAGE_DESC)); - cliOptions.add(new CliOption(CodegenConstants.GROUP_ID, CodegenConstants.GROUP_ID_DESC)); - cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_ID, CodegenConstants.ARTIFACT_ID_DESC)); - cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_VERSION, CodegenConstants.ARTIFACT_VERSION_DESC)); - cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC)); + cliOptions.add(new CliOption(CodegenConstants.SOURCE_FOLDER, CodegenConstants.SOURCE_FOLDER_DESC).defaultValue("src")); cliOptions.add(new CliOption(CodegenConstants.LOCAL_VARIABLE_PREFIX, CodegenConstants.LOCAL_VARIABLE_PREFIX_DESC)); - cliOptions.add(new CliOption(CodegenConstants.SERIALIZABLE_MODEL, CodegenConstants.SERIALIZABLE_MODEL_DESC)); - cliOptions.add(new CliOption("fullJavaUtil", "whether to use fully qualified name for classes under java.util (default to false)")); - + cliOptions.add(new CliOption(PROJECT_NAME, + "name of the project (Default: generated from info.title or \"swagger-js-client\")")); + cliOptions.add(new CliOption(MODULE_NAME, + "module name for AMD, Node or globals (Default: generated from )")); + cliOptions.add(new CliOption(PROJECT_DESCRIPTION, + "description of the project (Default: using info.description or \"Client library of \")")); + cliOptions.add(new CliOption(PROJECT_VERSION, + "version of the project (Default: using info.version or \"1.0.0\")")); + cliOptions.add(new CliOption(PROJECT_LICENSE_NAME, + "name of the license the project uses (Default: using info.license.name)")); } @Override @@ -109,8 +117,94 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo public void processOpts() { super.processOpts(); - typeMapping.put("array", "Array"); - + typeMapping = new HashMap(); + typeMapping.put("array", "Array"); + typeMapping.put("List", "Array"); + typeMapping.put("map", "Object"); + typeMapping.put("object", "Object"); + typeMapping.put("boolean", "Boolean"); + typeMapping.put("char", "String"); + typeMapping.put("string", "String"); + typeMapping.put("short", "Integer"); + typeMapping.put("int", "Integer"); + typeMapping.put("integer", "Integer"); + typeMapping.put("long", "Integer"); + typeMapping.put("float", "Number"); + typeMapping.put("double", "Number"); + typeMapping.put("number", "Number"); + typeMapping.put("DateTime", "Date"); + + importMapping.clear(); + } + + @Override + public void preprocessSwagger(Swagger swagger) { + super.preprocessSwagger(swagger); + + if (additionalProperties.containsKey(PROJECT_NAME)) { + projectName = ((String) additionalProperties.get(PROJECT_NAME)); + } + if (additionalProperties.containsKey(MODULE_NAME)) { + moduleName = ((String) additionalProperties.get(MODULE_NAME)); + } + if (additionalProperties.containsKey(PROJECT_DESCRIPTION)) { + projectDescription = ((String) additionalProperties.get(PROJECT_DESCRIPTION)); + } + if (additionalProperties.containsKey(PROJECT_VERSION)) { + projectVersion = ((String) additionalProperties.get(PROJECT_VERSION)); + } + if (additionalProperties.containsKey(CodegenConstants.LOCAL_VARIABLE_PREFIX)) { + localVariablePrefix = (String) additionalProperties.get(CodegenConstants.LOCAL_VARIABLE_PREFIX); + } + if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)) { + sourceFolder = (String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER); + } + + if (swagger.getInfo() != null) { + Info info = swagger.getInfo(); + if (projectName == null && info.getTitle() != null) { + // when projectName is not specified, generate it from info.title + projectName = dashize(info.getTitle()); + } + if (projectVersion == null) { + // when projectVersion is not specified, use info.version + projectVersion = info.getVersion(); + } + if (projectDescription == null) { + // when projectDescription is not specified, use info.description + projectDescription = info.getDescription(); + } + if (info.getLicense() != null) { + License license = info.getLicense(); + if (additionalProperties.get(PROJECT_LICENSE_NAME) == null) { + additionalProperties.put(PROJECT_LICENSE_NAME, license.getName()); + } + } + } + + // default values + if (projectName == null) { + projectName = "swagger-js-client"; + } + if (moduleName == null) { + moduleName = camelize(underscore(projectName)); + } + if (projectVersion == null) { + projectVersion = "1.0.0"; + } + if (projectDescription == null) { + projectDescription = "Client library of " + projectName; + } + + additionalProperties.put(PROJECT_NAME, projectName); + additionalProperties.put(MODULE_NAME, moduleName); + additionalProperties.put(PROJECT_DESCRIPTION, escapeText(projectDescription)); + additionalProperties.put(PROJECT_VERSION, projectVersion); + additionalProperties.put(CodegenConstants.LOCAL_VARIABLE_PREFIX, localVariablePrefix); + additionalProperties.put(CodegenConstants.SOURCE_FOLDER, sourceFolder); + + supportingFiles.add(new SupportingFile("package.mustache", "", "package.json")); + supportingFiles.add(new SupportingFile("index.mustache", sourceFolder, "index.js")); } @Override @@ -180,6 +274,16 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo return toModelName(name); } + @Override + public String toModelImport(String name) { + return name; + } + + @Override + public String toApiImport(String name) { + return toApiName(name); + } + @Override public String getTypeDeclaration(Property p) { if (p instanceof ArrayProperty) { @@ -198,84 +302,42 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo @Override public String toDefaultValue(Property p) { if (p instanceof ArrayProperty) { - final ArrayProperty ap = (ArrayProperty) p; - final String pattern; - //if (fullJavaUtil) { - // pattern = "new ArrayList()"; - //} else { - // pattern = "new ArrayList<%s>()"; - //} - - pattern = "new Array()"; - return String.format(pattern, getTypeDeclaration(ap.getItems())); + return "[]"; } else if (p instanceof MapProperty) { - final MapProperty ap = (MapProperty) p; - final String pattern; - if (fullJavaUtil) { - pattern = "new java.util.HashMap()"; - } else { - pattern = "new HashMap()"; - } - return String.format(pattern, getTypeDeclaration(ap.getAdditionalProperties())); - + return "{}"; } else if (p instanceof LongProperty) { LongProperty dp = (LongProperty) p; if (dp.getDefault() != null) { return dp.getDefault().toString()+"l"; } return "null"; - + // added for Javascript } else if (p instanceof RefProperty) { - RefProperty rp = (RefProperty)p; - System.out.println("rp: " + rp.getName() + rp.getAccess() + rp.getDescription() + rp.getExample() + rp.getFormat() + rp.getSimpleRef() + rp.getTitle() + rp.getType()); - - return "new " +rp.getSimpleRef() + "()"; + RefProperty rp = (RefProperty)p; + return "new " +rp.getSimpleRef() + "()"; } - - System.out.println("property: " + p); - + return super.toDefaultValue(p); } - + @Override public String toDefaultValueWithParam(String name, Property p) { if (p instanceof ArrayProperty) { - final ArrayProperty ap = (ArrayProperty) p; - final String pattern; -// if (fullJavaUtil) { -// pattern = "new java.util.ArrayList<%s>()"; -// } else { -// pattern = "new ArrayList<%s>()" ; -// } - pattern = " = new Array()" ; - - return String.format(pattern, getTypeDeclaration(ap.getItems()))+ ";"; + return " = new Array();"; } else if (p instanceof MapProperty) { - final MapProperty ap = (MapProperty) p; - final String pattern; - if (fullJavaUtil) { - pattern = " = new java.util.HashMap()"; - } else { - pattern = "new HashMap()"; - } - return String.format(pattern, getTypeDeclaration(ap.getAdditionalProperties()))+ ";"; - + return " = {}"; } else if (p instanceof LongProperty) { LongProperty dp = (LongProperty) p; return " = data." + name + ";"; - + // added for Javascript } else if (p instanceof RefProperty) { - RefProperty rp = (RefProperty)p; - System.out.println("rp: " + rp.getName() + rp.getAccess() + rp.getDescription() + rp.getExample() + rp.getFormat() + rp.getSimpleRef() + rp.getTitle() + rp.getType()); - - return ".constructFromObject(data." + name + ");"; + RefProperty rp = (RefProperty)p; + return ".constructFromObject(data." + name + ");"; } - - System.out.println("property: " + p); - + return super.toDefaultValueWithParam(name, p); } @@ -286,7 +348,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo String type = null; if (typeMapping.containsKey(swaggerType)) { type = typeMapping.get(swaggerType); - if (languageSpecificPrimitives.contains(type) || type.indexOf(".") >= 0) { + if (!needToImport(type)) { return type; } } else { @@ -373,6 +435,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo return objs; } + @Override public Map postProcessOperations(Map objs) { if("retrofit".equals(getLibrary())) { Map operations = (Map) objs.get("operations"); @@ -396,8 +459,10 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo return objs; } + @Override protected boolean needToImport(String type) { - return super.needToImport(type) && type.indexOf(".") < 0; + return !defaultIncludes.contains(type) + && !languageSpecificPrimitives.contains(type); } private String findCommonPrefixOfVars(List vars) { @@ -449,7 +514,7 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo } } } - + if(removedChildEnum) { // If we removed an entry from this model's vars, we need to ensure hasMore is updated int count = 0, numVars = codegenProperties.size(); @@ -464,39 +529,6 @@ public class JavascriptClientCodegen extends DefaultCodegen implements CodegenCo return codegenModel; } - public void setInvokerPackage(String invokerPackage) { - this.invokerPackage = invokerPackage; - } - - public void setGroupId(String groupId) { - this.groupId = groupId; - } - - public void setArtifactId(String artifactId) { - this.artifactId = artifactId; - } - - public void setArtifactVersion(String artifactVersion) { - this.artifactVersion = artifactVersion; - } - - public void setSourceFolder(String sourceFolder) { - this.sourceFolder = sourceFolder; - } - - public void setLocalVariablePrefix(String localVariablePrefix) { - this.localVariablePrefix = localVariablePrefix; - } - - - public Boolean getSerializableModel() { - return serializableModel; - } - - public void setSerializableModel(Boolean serializableModel) { - this.serializableModel = serializableModel; - } - private String sanitizePackageName(String packageName) { packageName = packageName.trim(); packageName = packageName.replaceAll("[^a-zA-Z0-9_\\.]", "_"); diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java index 532abab4596e..5814751d63c9 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/JaxRSServerCodegen.java @@ -5,12 +5,15 @@ import io.swagger.models.Operation; import io.swagger.models.Path; import io.swagger.models.Swagger; +import java.io.File; import java.util.*; public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConfig { + protected String dateLibrary = "default"; protected String title = "Swagger Server"; protected String implFolder = "src/main/java"; + public static final String DATE_LIBRARY = "dateLibrary"; public JaxRSServerCodegen() { super(); @@ -24,23 +27,52 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf apiTemplateFiles.put("apiService.mustache", ".java"); apiTemplateFiles.put("apiServiceImpl.mustache", ".java"); apiTemplateFiles.put("apiServiceFactory.mustache", ".java"); - embeddedTemplateDir = templateDir = "JavaJaxRS"; apiPackage = "io.swagger.api"; modelPackage = "io.swagger.model"; additionalProperties.put("title", title); + embeddedTemplateDir = templateDir = "JavaJaxRS" + File.separator + "jersey1_18"; + + for(int i = 0; i < cliOptions.size(); i++) { + if(CodegenConstants.LIBRARY.equals(cliOptions.get(i).getOpt())) { + cliOptions.remove(i); + break; + } + } + + CliOption dateLibrary = new CliOption(DATE_LIBRARY, "Option. Date library to use"); + Map dateOptions = new HashMap(); + dateOptions.put("java8", "Java 8 native"); + dateOptions.put("joda", "Joda"); + dateLibrary.setEnum(dateOptions); + + cliOptions.add(dateLibrary); + + CliOption library = new CliOption(CodegenConstants.LIBRARY, "library template (sub-template) to use"); + library.setDefault(DEFAULT_LIBRARY); + + Map supportedLibraries = new LinkedHashMap(); + + supportedLibraries.put(DEFAULT_LIBRARY, "Jersey core 1.18.1"); +// supportedLibraries.put("jersey2", "Jersey2 core library 2.x"); + library.setEnum(supportedLibraries); + + cliOptions.add(library); cliOptions.add(new CliOption(CodegenConstants.IMPL_FOLDER, CodegenConstants.IMPL_FOLDER_DESC)); } + @Override public CodegenType getTag() { return CodegenType.SERVER; } + @Override public String getName() { return "jaxrs"; } + @Override public String getHelp() { return "Generates a Java JAXRS Server application."; } @@ -53,6 +85,10 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf implFolder = (String) additionalProperties.get(CodegenConstants.IMPL_FOLDER); } +// if("jersey2".equals(getLibrary())) { +// embeddedTemplateDir = templateDir = "JavaJaxRS" + File.separator + "jersey2"; +// } + supportingFiles.clear(); supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); @@ -66,7 +102,39 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf (sourceFolder + '/' + apiPackage).replace(".", "/"), "NotFoundException.java")); supportingFiles.add(new SupportingFile("web.mustache", ("src/main/webapp/WEB-INF"), "web.xml")); + supportingFiles.add(new SupportingFile("StringUtil.mustache", + (sourceFolder + '/' + apiPackage).replace(".", "/"), "StringUtil.java")); + if (additionalProperties.containsKey("dateLibrary")) { + setDateLibrary(additionalProperties.get("dateLibrary").toString()); + additionalProperties.put(dateLibrary, "true"); + } + + if("joda".equals(dateLibrary)) { + typeMapping.put("date", "LocalDate"); + typeMapping.put("DateTime", "DateTime"); + + importMapping.put("LocalDate", "org.joda.time.LocalDate"); + importMapping.put("DateTime", "org.joda.time.DateTime"); + + supportingFiles.add(new SupportingFile("JodaDateTimeProvider.mustache", + (sourceFolder + '/' + apiPackage).replace(".", "/"), "JodaDateTimeProvider.java")); + supportingFiles.add(new SupportingFile("JodaLocalDateProvider.mustache", + (sourceFolder + '/' + apiPackage).replace(".", "/"), "JodaLocalDateProvider.java")); + } + else if ("java8".equals(dateLibrary)) { + additionalProperties.put("java8", "true"); + additionalProperties.put("javaVersion", "1.8"); + typeMapping.put("date", "LocalDate"); + typeMapping.put("DateTime", "LocalDateTime"); + importMapping.put("LocalDate", "java.time.LocalDate"); + importMapping.put("LocalDateTime", "java.time.LocalDateTime"); + + supportingFiles.add(new SupportingFile("LocalDateTimeProvider.mustache", + (sourceFolder + '/' + apiPackage).replace(".", "/"), "LocalDateTimeProvider.java")); + supportingFiles.add(new SupportingFile("LocalDateProvider.mustache", + (sourceFolder + '/' + apiPackage).replace(".", "/"), "LocalDateProvider.java")); + } } @Override @@ -102,6 +170,16 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf if("/".equals(swagger.getBasePath())) { swagger.setBasePath(""); } + + String host = swagger.getHost(); + String port = "8080"; + if(host != null) { + String[] parts = host.split(":"); + if(parts.length > 1) { + port = parts[1]; + } + } + this.additionalProperties.put("serverPort", port); if(swagger != null && swagger.getPaths() != null) { for(String pathname : swagger.getPaths().keySet()) { Path path = swagger.getPath(pathname); @@ -131,21 +209,6 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf } @Override - public Map postProcessModels(Map objs) { - List models = (List) objs.get("models"); - for (Object _mo : models) { - Map mo = (Map) _mo; - CodegenModel cm = (CodegenModel) mo.get("model"); - for (CodegenProperty var : cm.vars) { - // handle default value for enum, e.g. available => StatusEnum.available - if (var.isEnum && var.defaultValue != null && !"null".equals(var.defaultValue)) { - var.defaultValue = var.datatypeWithEnum + "." + var.defaultValue; - } - } - } - return objs; - } - public Map postProcessOperations(Map objs) { Map operations = (Map) objs.get("operations"); if (operations != null) { @@ -224,7 +287,12 @@ public class JaxRSServerCodegen extends JavaClientCodegen implements CodegenConf return outputFolder + "/" + output + "/" + apiPackage().replace('.', '/'); } + @Override public boolean shouldOverwrite(String filename) { return super.shouldOverwrite(filename) && !filename.endsWith("ServiceImpl.java") && !filename.endsWith("ServiceFactory.java"); } + + public void setDateLibrary(String library) { + this.dateLibrary = library; + } } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NodeJSServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NodeJSServerCodegen.java index 4dee5f6f2df6..75581e6a06de 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NodeJSServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/NodeJSServerCodegen.java @@ -1,14 +1,21 @@ package io.swagger.codegen.languages; +import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.module.SimpleModule; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; + import io.swagger.codegen.*; import io.swagger.models.Swagger; import io.swagger.util.Yaml; import java.io.File; +import java.io.IOException; +import java.math.BigDecimal; import java.util.*; import java.util.Map.Entry; @@ -97,6 +104,7 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig } } + @Override public String apiPackage() { return "controllers"; } @@ -107,6 +115,7 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig * @return the CodegenType for this generator * @see io.swagger.codegen.CodegenType */ + @Override public CodegenType getTag() { return CodegenType.SERVER; } @@ -117,6 +126,7 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig * * @return the friendly name for the generator */ + @Override public String getName() { return "nodejs"; } @@ -127,6 +137,7 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig * * @return A string value for the help message */ + @Override public String getHelp() { return "Generates a nodejs server library using the swagger-tools project. By default, " + "it will also generate service classes--which you can disable with the `-Dnoservice` environment variable."; @@ -238,7 +249,15 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig Swagger swagger = (Swagger)objs.get("swagger"); if(swagger != null) { try { - objs.put("swagger-yaml", Yaml.mapper().writeValueAsString(swagger)); + SimpleModule module = new SimpleModule(); + module.addSerializer(Double.class, new JsonSerializer() { + @Override + public void serialize(Double val, JsonGenerator jgen, + SerializerProvider provider) throws IOException, JsonProcessingException { + jgen.writeNumber(new BigDecimal(val)); + } + }); + objs.put("swagger-yaml", Yaml.mapper().registerModule(module).writeValueAsString(swagger)); } catch (JsonProcessingException e) { e.printStackTrace(); } @@ -252,4 +271,4 @@ public class NodeJSServerCodegen extends DefaultCodegen implements CodegenConfig } return super.postProcessSupportingFileData(objs); } -} \ No newline at end of file +} diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java index 9c488db1254a..78a60089cf7b 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ObjcClientCodegen.java @@ -133,14 +133,17 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { cliOptions.add(new CliOption(LICENSE, "License to use in the podspec file.").defaultValue("MIT")); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "objc"; } + @Override public String getHelp() { return "Generates an Objective-C client library."; } @@ -356,6 +359,7 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { return classPrefix + camelize(name) + "Api"; } + @Override public String toApiFilename(String name) { return classPrefix + camelize(name) + "Api"; } @@ -395,6 +399,7 @@ public class ObjcClientCodegen extends DefaultCodegen implements CodegenConfig { return toVarName(name); } + @Override public String escapeReservedWord(String name) { return "_" + name; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java index 27f39f11ed0d..76c1afacb565 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PerlClientCodegen.java @@ -7,6 +7,7 @@ import io.swagger.codegen.SupportingFile; import io.swagger.codegen.CodegenConstants; import io.swagger.codegen.CliOption; import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.BooleanProperty; import io.swagger.models.properties.MapProperty; import io.swagger.models.properties.Property; @@ -64,7 +65,7 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { typeMapping.put("boolean", "boolean"); typeMapping.put("string", "string"); typeMapping.put("date", "DateTime"); - typeMapping.put("dateTime", "DateTime"); + typeMapping.put("DateTime", "DateTime"); typeMapping.put("password", "string"); typeMapping.put("array", "ARRAY"); typeMapping.put("map", "HASH"); @@ -73,8 +74,10 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { cliOptions.clear(); cliOptions.add(new CliOption(MODULE_NAME, "Perl module name (convention: CamelCase).").defaultValue("SwaggerClient")); cliOptions.add(new CliOption(MODULE_VERSION, "Perl module version.").defaultValue("1.0.0")); - cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC)); - cliOptions.add(new CliOption(CodegenConstants.ENSURE_UNIQUE_PARAMS, CodegenConstants.ENSURE_UNIQUE_PARAMS_DESC)); + cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, + CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC, BooleanProperty.TYPE)); + cliOptions.add(new CliOption(CodegenConstants.ENSURE_UNIQUE_PARAMS, CodegenConstants.ENSURE_UNIQUE_PARAMS_DESC, + BooleanProperty.TYPE)); } @@ -97,21 +100,24 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { supportingFiles.add(new SupportingFile("ApiClient.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "ApiClient.pm")); supportingFiles.add(new SupportingFile("Configuration.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "Configuration.pm")); - supportingFiles.add(new SupportingFile("BaseObject.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "Object/BaseObject.pm")); supportingFiles.add(new SupportingFile("ApiFactory.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "ApiFactory.pm")); supportingFiles.add(new SupportingFile("Role.mustache", ("lib/WWW/" + moduleName).replace('/', File.separatorChar), "Role.pm")); supportingFiles.add(new SupportingFile("AutoDoc.mustache", ("lib/WWW/" + moduleName + "/Role").replace('/', File.separatorChar), "AutoDoc.pm")); - supportingFiles.add(new SupportingFile("autodoc.script.mustache", ("bin/").replace('/', File.separatorChar), "autodoc")); + supportingFiles.add(new SupportingFile("autodoc.script.mustache", "bin", "autodoc")); + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "perl"; } + @Override public String getHelp() { return "Generates a Perl client library."; } @@ -126,6 +132,7 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { return (outputFolder + "/lib/WWW/" + moduleName + apiPackage()).replace('/', File.separatorChar); } + @Override public String modelFileFolder() { return (outputFolder + "/lib/WWW/" + moduleName + modelPackage()).replace('/', File.separatorChar); } @@ -162,6 +169,7 @@ public class PerlClientCodegen extends DefaultCodegen implements CodegenConfig { return type; } + @Override public String toDefaultValue(Property p) { return "null"; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java index c712374f4241..192fd285e534 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PhpClientCodegen.java @@ -76,7 +76,7 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { String primitives = "'" + StringUtils.join(languageSpecificPrimitives, "', '") + "'"; additionalProperties.put("primitives", primitives); - // ref: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#data-types + // ref: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types typeMapping = new HashMap(); typeMapping.put("integer", "int"); typeMapping.put("long", "int"); @@ -85,14 +85,13 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { typeMapping.put("string", "string"); typeMapping.put("byte", "int"); typeMapping.put("boolean", "bool"); - typeMapping.put("date", "\\DateTime"); - typeMapping.put("datetime", "\\DateTime"); + typeMapping.put("Date", "\\DateTime"); + typeMapping.put("DateTime", "\\DateTime"); typeMapping.put("file", "\\SplFileObject"); typeMapping.put("map", "map"); typeMapping.put("array", "array"); typeMapping.put("list", "array"); typeMapping.put("object", "object"); - typeMapping.put("DateTime", "\\DateTime"); cliOptions.add(new CliOption(CodegenConstants.MODEL_PACKAGE, CodegenConstants.MODEL_PACKAGE_DESC)); cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC)); @@ -139,14 +138,17 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { .replaceAll(regLastPathSeparator+ "$", ""); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "php"; } + @Override public String getHelp() { return "Generates a PHP client library."; } @@ -223,6 +225,7 @@ public class PhpClientCodegen extends DefaultCodegen implements CodegenConfig { return (outputFolder + "/" + toPackagePath(apiPackage, srcBasePath)); } + @Override public String modelFileFolder() { return (outputFolder + "/" + toPackagePath(modelPackage, srcBasePath)); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java index b5aa56aa2c46..3ff4ce8b3681 100755 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java @@ -15,8 +15,8 @@ import java.util.HashSet; import org.apache.commons.lang.StringUtils; public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig { - protected String packageName = null; - protected String packageVersion = null; + protected String packageName; + protected String packageVersion; public PythonClientCodegen() { super(); @@ -65,7 +65,8 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig .defaultValue("swagger_client")); cliOptions.add(new CliOption(CodegenConstants.PACKAGE_VERSION, "python package version.") .defaultValue("1.0.0")); - cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC)); + cliOptions.add(new CliOption(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, + CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC, BooleanProperty.TYPE)); } @Override @@ -108,14 +109,17 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig return str.replaceAll("\\.", "_"); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "python"; } + @Override public String getHelp() { return "Generates a Python client library."; } @@ -130,6 +134,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig return outputFolder + File.separatorChar + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + File.separatorChar + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Qt5CPPGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Qt5CPPGenerator.java index 2abff5515b08..18ba3718068e 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Qt5CPPGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/Qt5CPPGenerator.java @@ -140,6 +140,7 @@ public class Qt5CPPGenerator extends DefaultCodegen implements CodegenConfig { * @return the CodegenType for this generator * @see io.swagger.codegen.CodegenType */ + @Override public CodegenType getTag() { return CodegenType.CLIENT; } @@ -150,6 +151,7 @@ public class Qt5CPPGenerator extends DefaultCodegen implements CodegenConfig { * * @return the friendly name for the generator */ + @Override public String getName() { return "qt5cpp"; } @@ -160,6 +162,7 @@ public class Qt5CPPGenerator extends DefaultCodegen implements CodegenConfig { * * @return A string value for the help message */ + @Override public String getHelp() { return "Generates a qt5 C++ client library."; } @@ -189,6 +192,7 @@ public class Qt5CPPGenerator extends DefaultCodegen implements CodegenConfig { * Location to write model files. You can use the modelPackage() as defined when the class is * instantiated */ + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java index 2fd6d8d8bc09..3f99f4d8030c 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/RubyClientCodegen.java @@ -19,8 +19,8 @@ public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig { public static final String GEM_NAME = "gemName"; public static final String MODULE_NAME = "moduleName"; public static final String GEM_VERSION = "gemVersion"; - protected String gemName = null; - protected String moduleName = null; + protected String gemName; + protected String moduleName; protected String gemVersion = "1.0.0"; protected String libFolder = "lib"; @@ -127,17 +127,19 @@ public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig { supportingFiles.add(new SupportingFile("configuration.mustache", gemFolder, "configuration.rb")); supportingFiles.add(new SupportingFile("version.mustache", gemFolder, "version.rb")); String modelFolder = gemFolder + File.separator + modelPackage.replace("/", File.separator); - supportingFiles.add(new SupportingFile("base_object.mustache", modelFolder, "base_object.rb")); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "ruby"; } + @Override public String getHelp() { return "Generates a Ruby client library."; } @@ -166,6 +168,7 @@ public class RubyClientCodegen extends DefaultCodegen implements CodegenConfig { return outputFolder + File.separator + libFolder + File.separator + gemName + File.separator + apiPackage.replace("/", File.separator); } + @Override public String modelFileFolder() { return outputFolder + File.separator + libFolder + File.separator + gemName + File.separator + modelPackage.replace("/", File.separator); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java index b2f5b9571dd2..9469cbb8e819 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalaClientCodegen.java @@ -35,7 +35,7 @@ public class ScalaClientCodegen extends DefaultCodegen implements CodegenConfig protected String artifactVersion = "1.0.0"; protected String sourceFolder = "src/main/scala"; protected String authScheme = ""; - protected boolean authPreemptive = false; + protected boolean authPreemptive; protected boolean asyncHttpClient = !authScheme.isEmpty(); public ScalaClientCodegen() { @@ -112,14 +112,17 @@ public class ScalaClientCodegen extends DefaultCodegen implements CodegenConfig cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC)); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "scala"; } + @Override public String getHelp() { return "Generates a Scala client library."; } @@ -134,6 +137,7 @@ public class ScalaClientCodegen extends DefaultCodegen implements CodegenConfig return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } @@ -183,6 +187,7 @@ public class ScalaClientCodegen extends DefaultCodegen implements CodegenConfig } } + @Override public String toDefaultValue(Property p) { if (p instanceof StringProperty) { return "null"; diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalatraServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalatraServerCodegen.java index d50fa8678876..5d6da580130d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalatraServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/ScalatraServerCodegen.java @@ -123,14 +123,17 @@ public class ScalatraServerCodegen extends DefaultCodegen implements CodegenConf cliOptions.add(new CliOption(CodegenConstants.API_PACKAGE, CodegenConstants.API_PACKAGE_DESC)); } + @Override public CodegenType getTag() { return CodegenType.SERVER; } + @Override public String getName() { return "scalatra"; } + @Override public String getHelp() { return "Generates a Scala server application with Scalatra."; } @@ -145,6 +148,7 @@ public class ScalatraServerCodegen extends DefaultCodegen implements CodegenConf return outputFolder + "/" + sourceFolder + "/" + apiPackage().replace('.', File.separatorChar); } + @Override public String modelFileFolder() { return outputFolder + "/" + sourceFolder + "/" + modelPackage().replace('.', File.separatorChar); } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java index 2e35f412bbfb..4effb480048e 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SilexServerCodegen.java @@ -65,7 +65,7 @@ public class SilexServerCodegen extends DefaultCodegen implements CodegenConfig instantiationTypes.put("array", "array"); instantiationTypes.put("map", "map"); - // ref: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#data-types + // ref: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types typeMapping = new HashMap(); typeMapping.put("integer", "int"); typeMapping.put("long", "int"); @@ -88,14 +88,17 @@ public class SilexServerCodegen extends DefaultCodegen implements CodegenConfig supportingFiles.add(new SupportingFile(".htaccess", packagePath.replace('/', File.separatorChar), ".htaccess")); } + @Override public CodegenType getTag() { return CodegenType.SERVER; } + @Override public String getName() { return "silex-PHP"; } + @Override public String getHelp() { return "Generates a Silex server library."; } @@ -110,6 +113,7 @@ public class SilexServerCodegen extends DefaultCodegen implements CodegenConfig return (outputFolder + "/" + apiPackage()).replace('/', File.separatorChar); } + @Override public String modelFileFolder() { return (outputFolder + "/" + modelPackage()).replace('/', File.separatorChar); } @@ -148,6 +152,7 @@ public class SilexServerCodegen extends DefaultCodegen implements CodegenConfig return toModelName(type); } + @Override public String toDefaultValue(Property p) { return "null"; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java index 1c31b45664e6..e478c00341e2 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SinatraServerCodegen.java @@ -21,8 +21,8 @@ import java.util.Map; import org.apache.commons.lang.StringUtils; public class SinatraServerCodegen extends DefaultCodegen implements CodegenConfig { - protected String gemName = null; - protected String moduleName = null; + protected String gemName; + protected String moduleName; protected String gemVersion = "1.0.0"; protected String libFolder = "lib"; @@ -81,14 +81,17 @@ public class SinatraServerCodegen extends DefaultCodegen implements CodegenConfi supportingFiles.add(new SupportingFile("swagger.mustache","","swagger.yaml")); } + @Override public CodegenType getTag() { return CodegenType.SERVER; } + @Override public String getName() { return "sinatra"; } + @Override public String getHelp() { return "Generates a Sinatra server library."; } @@ -135,6 +138,7 @@ public class SinatraServerCodegen extends DefaultCodegen implements CodegenConfi return type; } + @Override public String toDefaultValue(Property p) { return "null"; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java index ef318cb6bddf..ae28493fe7ce 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SlimFrameworkServerCodegen.java @@ -67,7 +67,7 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege instantiationTypes.put("array", "array"); instantiationTypes.put("map", "map"); - // ref: https://github.com/swagger-api/swagger-spec/blob/master/versions/2.0.md#data-types + // ref: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#data-types typeMapping = new HashMap(); typeMapping.put("integer", "int"); typeMapping.put("long", "int"); @@ -90,14 +90,17 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege supportingFiles.add(new SupportingFile(".htaccess", packagePath.replace('/', File.separatorChar), ".htaccess")); } + @Override public CodegenType getTag() { return CodegenType.SERVER; } + @Override public String getName() { return "slim"; } + @Override public String getHelp() { return "Generates a Slim Framework server library."; } @@ -112,6 +115,7 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege return (outputFolder + "/" + apiPackage()).replace('/', File.separatorChar); } + @Override public String modelFileFolder() { return (outputFolder + "/" + modelPackage()).replace('/', File.separatorChar); } @@ -162,6 +166,7 @@ public class SlimFrameworkServerCodegen extends DefaultCodegen implements Codege return super.getTypeDeclaration(name); } + @Override public String toDefaultValue(Property p) { return "null"; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java index 446185bcd47e..256f78b02b63 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SpringMVCServerCodegen.java @@ -2,28 +2,21 @@ package io.swagger.codegen.languages; import io.swagger.codegen.*; import io.swagger.models.Operation; -import io.swagger.models.properties.ArrayProperty; -import io.swagger.models.properties.MapProperty; -import io.swagger.models.properties.Property; import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Iterator; +import java.util.*; public class SpringMVCServerCodegen extends JavaClientCodegen implements CodegenConfig { public static final String CONFIG_PACKAGE = "configPackage"; protected String title = "Petstore Server"; protected String configPackage = ""; + protected String templateFileName = "api.mustache"; public SpringMVCServerCodegen() { super(); outputFolder = "generated-code/javaSpringMVC"; modelTemplateFiles.put("model.mustache", ".java"); - apiTemplateFiles.put("api.mustache", ".java"); + apiTemplateFiles.put(templateFileName, ".java"); embeddedTemplateDir = templateDir = "JavaSpringMVC"; apiPackage = "io.swagger.api"; modelPackage = "io.swagger.model"; @@ -51,16 +44,24 @@ public class SpringMVCServerCodegen extends JavaClientCodegen implements Codegen ); cliOptions.add(new CliOption(CONFIG_PACKAGE, "configuration package for generated code")); + + supportedLibraries.clear(); + supportedLibraries.put(DEFAULT_LIBRARY, "Default Spring MVC server stub."); + supportedLibraries.put("j8-async", "Use async servlet feature and Java 8's default interface. Generating interface with service " + + "declaration is useful when using Maven plugin. Just provide a implementation with @Controller to instantiate service."); } + @Override public CodegenType getTag() { return CodegenType.SERVER; } + @Override public String getName() { return "spring-mvc"; } + @Override public String getHelp() { return "Generates a Java Spring-MVC Server application using the SpringFox integration."; } @@ -126,6 +127,7 @@ public class SpringMVCServerCodegen extends JavaClientCodegen implements Codegen co.baseName = basePath; } + @Override public Map postProcessOperations(Map objs) { Map operations = (Map) objs.get("operations"); if (operations != null) { @@ -139,8 +141,6 @@ public class SpringMVCServerCodegen extends JavaClientCodegen implements Codegen } } } - System.out.println(operation.operationId); - io.swagger.util.Json.prettyPrint(operation); if (operation.returnType == null) { operation.returnType = "Void"; @@ -168,6 +168,24 @@ public class SpringMVCServerCodegen extends JavaClientCodegen implements Codegen } } } + if("j8-async".equals(getLibrary())) { + apiTemplateFiles.remove(this.templateFileName); + this.templateFileName = "api-j8-async.mustache"; + apiTemplateFiles.put(this.templateFileName, ".java"); + + int originalPomFileIdx = -1; + for (int i = 0; i < supportingFiles.size(); i++) { + if ("pom.xml".equals(supportingFiles.get(i).destinationFilename)) { + originalPomFileIdx = i; + break; + } + } + if (originalPomFileIdx > -1) { + supportingFiles.remove(originalPomFileIdx); + } + supportingFiles.add(new SupportingFile("pom-j8-async.mustache", "", "pom.xml")); + } + return objs; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticDocCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticDocCodegen.java index b27ba23a4cd4..99ba292915a3 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticDocCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticDocCodegen.java @@ -50,14 +50,17 @@ public class StaticDocCodegen extends DefaultCodegen implements CodegenConfig { instantiationTypes.put("map", "HashMap"); } + @Override public CodegenType getTag() { return CodegenType.DOCUMENTATION; } + @Override public String getName() { return "dynamic-html"; } + @Override public String getHelp() { return "Generates a dynamic HTML site."; } @@ -72,6 +75,7 @@ public class StaticDocCodegen extends DefaultCodegen implements CodegenConfig { return outputFolder + File.separator + sourceFolder + File.separator + "operations"; } + @Override public String modelFileFolder() { return outputFolder + File.separator + sourceFolder + File.separator + "models"; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticHtmlGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticHtmlGenerator.java index a86c2244995f..cb598f8fbd88 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticHtmlGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/StaticHtmlGenerator.java @@ -50,14 +50,17 @@ public class StaticHtmlGenerator extends DefaultCodegen implements CodegenConfig importMapping = new HashMap(); } + @Override public CodegenType getTag() { return CodegenType.DOCUMENTATION; } + @Override public String getName() { return "html"; } + @Override public String getHelp() { return "Generates a static HTML file."; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerGenerator.java index 3241dde7b922..a98d5fc5b131 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerGenerator.java @@ -19,14 +19,17 @@ public class SwaggerGenerator extends DefaultCodegen implements CodegenConfig { supportingFiles.add(new SupportingFile("README.md", "", "README.md")); } + @Override public CodegenType getTag() { return CodegenType.DOCUMENTATION; } + @Override public String getName() { return "swagger"; } + @Override public String getHelp() { return "Creates a static swagger.json file."; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerYamlGenerator.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerYamlGenerator.java index 8ee1440b17e9..9c4680112e9d 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerYamlGenerator.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwaggerYamlGenerator.java @@ -19,14 +19,17 @@ public class SwaggerYamlGenerator extends DefaultCodegen implements CodegenConfi supportingFiles.add(new SupportingFile("README.md", "", "README.md")); } + @Override public CodegenType getTag() { return CodegenType.DOCUMENTATION; } + @Override public String getName() { return "swagger-yaml"; } + @Override public String getHelp() { return "Creates a static swagger.yaml file."; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwiftCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwiftCodegen.java index fffd3aa2aae8..ddd72e4230b3 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwiftCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/SwiftCodegen.java @@ -40,19 +40,22 @@ public class SwiftCodegen extends DefaultCodegen implements CodegenConfig { protected static final String LIBRARY_PROMISE_KIT = "PromiseKit"; protected static final String[] RESPONSE_LIBRARIES = { LIBRARY_PROMISE_KIT }; protected String projectName = "SwaggerClient"; - protected boolean unwrapRequired = false; + protected boolean unwrapRequired; protected String[] responseAs = new String[0]; protected String sourceFolder = "Classes" + File.separator + "Swaggers"; private static final Pattern PATH_PARAM_PATTERN = Pattern.compile("\\{[a-zA-Z_]+\\}"); + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "swift"; } + @Override public String getHelp() { return "Generates a swift client library."; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TizenClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TizenClientCodegen.java index 8efb5276cffd..83241ddc5e70 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TizenClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TizenClientCodegen.java @@ -110,14 +110,17 @@ public class TizenClientCodegen extends DefaultCodegen implements CodegenConfig supportingFiles.add(new SupportingFile("error-body.mustache", sourceFolder, PREFIX + "Error.cpp")); } + @Override public CodegenType getTag() { return CodegenType.CLIENT; } + @Override public String getName() { return "tizen"; } + @Override public String getHelp() { return "Generates a Samsung Tizen C++ client library."; } @@ -250,6 +253,7 @@ public class TizenClientCodegen extends DefaultCodegen implements CodegenConfig return PREFIX + initialCaps(name) + "Api"; } + @Override public String toApiFilename(String name) { return PREFIX + initialCaps(name) + "Api"; } @@ -261,6 +265,7 @@ public class TizenClientCodegen extends DefaultCodegen implements CodegenConfig return "p" + paramName; } + @Override public String escapeReservedWord(String name) { return "_" + name; } diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngularClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngularClientCodegen.java index 6c9b615476de..60b6f2b34c62 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngularClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/TypeScriptAngularClientCodegen.java @@ -10,6 +10,7 @@ public class TypeScriptAngularClientCodegen extends AbstractTypeScriptClientCode return "typescript-angular"; } + @Override public String getHelp() { return "Generates a TypeScript AngularJS client library."; } diff --git a/modules/swagger-codegen/src/main/resources/Java/StringUtil.mustache b/modules/swagger-codegen/src/main/resources/Java/StringUtil.mustache index c9583f1bc636..073966b0c217 100644 --- a/modules/swagger-codegen/src/main/resources/Java/StringUtil.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/StringUtil.mustache @@ -39,13 +39,4 @@ public class StringUtil { } return out.toString(); } - - /** - * Convert the given object to string with each line indented by 4 spaces - * (except the first line). - */ - public static String toIndentedString(Object o) { - if (o == null) return "null"; - return o.toString().replace("\n", "\n "); - } } diff --git a/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache b/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache index e0ec74385ff0..6010e26704f5 100644 --- a/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/enumClass.mustache @@ -1,17 +1,17 @@ -public enum {{{datatypeWithEnum}}} { - {{#allowableValues}}{{#enumVars}}{{{name}}}("{{{value}}}"){{^-last}}, - {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} + public enum {{{datatypeWithEnum}}} { + {{#allowableValues}}{{#enumVars}}{{{name}}}("{{{value}}}"){{^-last}}, + {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} - private String value; + private String value; - {{{datatypeWithEnum}}}(String value) { - this.value = value; + {{{datatypeWithEnum}}}(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return value; + } } - - @Override - @JsonValue - public String toString() { - return value; - } -} diff --git a/modules/swagger-codegen/src/main/resources/Java/enumOuterClass.mustache b/modules/swagger-codegen/src/main/resources/Java/enumOuterClass.mustache new file mode 100644 index 000000000000..7aea7b92f22f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Java/enumOuterClass.mustache @@ -0,0 +1,3 @@ +public enum {{classname}} { + {{#allowableValues}}{{.}}{{^-last}}, {{/-last}}{{/allowableValues}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache index 99dcdb517805..8c0880bf2171 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/ApiClient.mustache @@ -23,6 +23,7 @@ import java.util.List; import java.util.ArrayList; import java.util.Date; import java.util.TimeZone; +import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -471,6 +472,23 @@ public class ApiClient { return this; } + /** + * Connect timeout (in milliseconds). + */ + public int getConnectTimeout() { + return httpClient.getConnectTimeout(); + } + + /** + * Sets the connect timeout (in milliseconds). + * A value of 0 means no timeout, otherwise values must be between 1 and + * {@link Integer#MAX_VALUE}. + */ + public ApiClient setConnectTimeout(int connectionTimeout) { + httpClient.setConnectTimeout(connectionTimeout, TimeUnit.MILLISECONDS); + return this; + } + /** * Format the given parameter object into string. */ diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache index b7b4ea2cf3f0..0794a94f6dce 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/okhttp-gson/model.mustache @@ -65,14 +65,25 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); + {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n"); {{/vars}}sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache index b7b4ea2cf3f0..0794a94f6dce 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit/model.mustache @@ -65,14 +65,25 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); + {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n"); {{/vars}}sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache index b7b4ea2cf3f0..0794a94f6dce 100644 --- a/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/libraries/retrofit2/model.mustache @@ -65,14 +65,25 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#seriali } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); + {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n"); {{/vars}}sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Java/model.mustache b/modules/swagger-codegen/src/main/resources/Java/model.mustache index ac27bca08de6..005d63991daf 100644 --- a/modules/swagger-codegen/src/main/resources/Java/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/model.mustache @@ -1,76 +1,15 @@ package {{package}}; -import {{invokerPackage}}.StringUtil; {{#imports}}import {{import}}; {{/imports}} -{{#serializableModel}} -import java.io.Serializable;{{/serializableModel}} -import java.util.Objects; - -import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.*; +{{#serializableModel}}import java.io.Serializable;{{/serializableModel}} {{#models}} - {{#model}}{{#description}} /** * {{description}} **/{{/description}} -@ApiModel(description = "{{{description}}}") -{{>generatedAnnotation}} -public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { - {{#vars}}{{#isEnum}} - -{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} - -{{>enumClass}}{{/items}}{{/items.isEnum}} - private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/vars}} - - {{#vars}} - /**{{#description}} - * {{{description}}}{{/description}}{{#minimum}} - * minimum: {{minimum}}{{/minimum}}{{#maximum}} - * maximum: {{maximum}}{{/maximum}} - **/ - @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") - @JsonProperty("{{baseName}}") - public {{{datatypeWithEnum}}} {{getter}}() { - return {{name}}; - } - public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { - this.{{name}} = {{name}}; - } - - {{/vars}} - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} - return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && - {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} - return true;{{/hasVars}} - } - - @Override - public int hashCode() { - return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" ").append(StringUtil.toIndentedString(super.toString())).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append(StringUtil.toIndentedString({{name}})).append("\n"); - {{/vars}}sb.append("}"); - return sb.toString(); - } -} +{{#isEnum}}{{>enumOuterClass}}{{/isEnum}} +{{^isEnum}}{{>pojo}}{{/isEnum}} {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache b/modules/swagger-codegen/src/main/resources/Java/pojo.mustache similarity index 57% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache rename to modules/swagger-codegen/src/main/resources/Java/pojo.mustache index 63bba4a8dfb9..eea33d346d4d 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Java/pojo.mustache @@ -1,34 +1,20 @@ -package {{package}}; - -{{#imports}}import {{import}}; -{{/imports}} - -import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; - -import java.util.Objects; -{{#models}} - -{{#model}}{{#unescapedDescription}} -/** - * {{unescapedDescription}} - **/{{/unescapedDescription}} -@ApiModel(description = "{{{description}}}") +{{#description}}@ApiModel(description = "{{{description}}}"){{/description}} {{>generatedAnnotation}} -public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { +public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { {{#vars}}{{#isEnum}} - public enum {{datatypeWithEnum}} { - {{#allowableValues}}{{#values}} {{.}}, {{/values}}{{/allowableValues}} - }; - private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/isEnum}}{{^isEnum}} - private {{{datatype}}} {{name}} = {{{defaultValue}}};{{/isEnum}}{{/vars}} + +{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} + +{{>enumClass}}{{/items}}{{/items.isEnum}} + private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/vars}} {{#vars}} - /**{{#unescapedDescription}} - * {{{unescapedDescription}}}{{/unescapedDescription}}{{#minimum}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} * minimum: {{minimum}}{{/minimum}}{{#maximum}} * maximum: {{maximum}}{{/maximum}} **/ + {{#vendorExtensions.extraAnnotation}}{{vendorExtensions.extraAnnotation}}{{/vendorExtensions.extraAnnotation}} @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") @JsonProperty("{{baseName}}") public {{{datatypeWithEnum}}} {{getter}}() { @@ -60,14 +46,23 @@ public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { } @Override - public String toString() { + public String toString() { StringBuilder sb = new StringBuilder(); sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" " + super.toString()).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append({{name}}).append("\n"); - {{/vars}}sb.append("}\n"); + {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n"); + {{/vars}}sb.append("}"); return sb.toString(); } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } } -{{/model}} -{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/JavaInflector/StringUtil.mustache b/modules/swagger-codegen/src/main/resources/JavaInflector/StringUtil.mustache new file mode 100644 index 000000000000..073966b0c217 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaInflector/StringUtil.mustache @@ -0,0 +1,42 @@ +package {{invokerPackage}}; + +{{>generatedAnnotation}} +public class StringUtil { + /** + * Check if the given array contains the given value (with case-insensitive comparison). + * + * @param array The array + * @param value The value to search + * @return true if the array contains the value + */ + public static boolean containsIgnoreCase(String[] array, String value) { + for (String str : array) { + if (value == null && str == null) return true; + if (value != null && value.equalsIgnoreCase(str)) return true; + } + return false; + } + + /** + * Join an array of strings with the given separator. + *

+ * Note: This might be replaced by utility method from commons-lang or guava someday + * if one of those libraries is added as dependency. + *

+ * + * @param array The array of strings + * @param separator The separator + * @return the resulting string + */ + public static String join(String[] array, String separator) { + int len = array.length; + if (len == 0) return ""; + + StringBuilder out = new StringBuilder(); + out.append(array[0]); + for (int i = 1; i < len; i++) { + out.append(separator).append(array[i]); + } + return out.toString(); + } +} diff --git a/modules/swagger-codegen/src/main/resources/JavaInflector/enumClass.mustache b/modules/swagger-codegen/src/main/resources/JavaInflector/enumClass.mustache new file mode 100644 index 000000000000..6010e26704f5 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaInflector/enumClass.mustache @@ -0,0 +1,17 @@ + + public enum {{{datatypeWithEnum}}} { + {{#allowableValues}}{{#enumVars}}{{{name}}}("{{{value}}}"){{^-last}}, + {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} + + private String value; + + {{{datatypeWithEnum}}}(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return value; + } + } diff --git a/modules/swagger-codegen/src/main/resources/JavaInflector/enumOuterClass.mustache b/modules/swagger-codegen/src/main/resources/JavaInflector/enumOuterClass.mustache new file mode 100644 index 000000000000..7aea7b92f22f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaInflector/enumOuterClass.mustache @@ -0,0 +1,3 @@ +public enum {{classname}} { + {{#allowableValues}}{{.}}{{^-last}}, {{/-last}}{{/allowableValues}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaInflector/model.mustache b/modules/swagger-codegen/src/main/resources/JavaInflector/model.mustache index 39f0f0b6fa12..005d63991daf 100644 --- a/modules/swagger-codegen/src/main/resources/JavaInflector/model.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaInflector/model.mustache @@ -3,50 +3,13 @@ package {{package}}; {{#imports}}import {{import}}; {{/imports}} -import io.swagger.annotations.*; -import com.fasterxml.jackson.annotation.JsonProperty; +{{#serializableModel}}import java.io.Serializable;{{/serializableModel}} {{#models}} - {{#model}}{{#description}} /** * {{description}} **/{{/description}} -@ApiModel(description = "{{{description}}}") -{{>generatedAnnotation}} -public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} { - {{#vars}}{{#isEnum}} - public enum {{datatypeWithEnum}} { - {{#allowableValues}}{{#values}} {{.}}, {{/values}}{{/allowableValues}} - }; - private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/isEnum}}{{^isEnum}} - private {{{datatype}}} {{name}} = {{{defaultValue}}};{{/isEnum}}{{/vars}} - - {{#vars}} - /**{{#description}} - * {{{description}}}{{/description}}{{#minimum}} - * minimum: {{minimum}}{{/minimum}}{{#maximum}} - * maximum: {{maximum}}{{/maximum}} - **/ - @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") - @JsonProperty("{{baseName}}") - public {{{datatypeWithEnum}}} {{getter}}() { - return {{name}}; - } - public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { - this.{{name}} = {{name}}; - } - - {{/vars}} - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("class {{classname}} {\n"); - {{#parent}}sb.append(" " + super.toString()).append("\n");{{/parent}} - {{#vars}}sb.append(" {{name}}: ").append({{name}}).append("\n"); - {{/vars}}sb.append("}\n"); - return sb.toString(); - } -} +{{#isEnum}}{{>enumOuterClass}}{{/isEnum}} +{{^isEnum}}{{>pojo}}{{/isEnum}} {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/JavaInflector/pojo.mustache b/modules/swagger-codegen/src/main/resources/JavaInflector/pojo.mustache new file mode 100644 index 000000000000..eea33d346d4d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaInflector/pojo.mustache @@ -0,0 +1,68 @@ +{{#description}}@ApiModel(description = "{{{description}}}"){{/description}} +{{>generatedAnnotation}} +public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { + {{#vars}}{{#isEnum}} + +{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} + +{{>enumClass}}{{/items}}{{/items.isEnum}} + private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/vars}} + + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + {{#vendorExtensions.extraAnnotation}}{{vendorExtensions.extraAnnotation}}{{/vendorExtensions.extraAnnotation}} + @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") + @JsonProperty("{{baseName}}") + public {{{datatypeWithEnum}}} {{getter}}() { + return {{name}}; + } + public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { + this.{{name}} = {{name}}; + } + + {{/vars}} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class {{classname}} {\n"); + {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n"); + {{/vars}}sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiException.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/ApiException.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiException.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/ApiException.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/ApiOriginFilter.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiOriginFilter.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/ApiOriginFilter.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/ApiResponseMessage.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/ApiResponseMessage.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/ApiResponseMessage.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/JodaDateTimeProvider.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/JodaDateTimeProvider.mustache new file mode 100644 index 000000000000..f94217909835 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/JodaDateTimeProvider.mustache @@ -0,0 +1,44 @@ +package {{apiPackage}}; + +import com.sun.jersey.core.spi.component.ComponentContext; +import com.sun.jersey.spi.inject.Injectable; +import com.sun.jersey.spi.inject.PerRequestTypeInjectableProvider; + +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.Provider; +import org.joda.time.DateTime; +import java.util.List; + +@Provider +public class JodaDateTimeProvider extends PerRequestTypeInjectableProvider { + private final UriInfo uriInfo; + + public JodaDateTimeProvider(@Context UriInfo uriInfo) { + super(DateTime.class); + this.uriInfo = uriInfo; + } + + @Override + public Injectable getInjectable(final ComponentContext cc, final QueryParam a) { + return new Injectable() { + @Override + public DateTime getValue() { + final List values = uriInfo.getQueryParameters().get(a.value()); + + if (values == null || values.isEmpty()) + return null; + if (values.size() > 1) { + throw new WebApplicationException(Response.status(Status.BAD_REQUEST). + entity(a.value() + " cannot contain multiple values").build()); + } + + return DateTime.parse(values.get(0)); + } + }; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/JodaLocalDateProvider.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/JodaLocalDateProvider.mustache new file mode 100644 index 000000000000..7bd4027e63dc --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/JodaLocalDateProvider.mustache @@ -0,0 +1,44 @@ +package {{apiPackage}}; + +import com.sun.jersey.core.spi.component.ComponentContext; +import com.sun.jersey.spi.inject.Injectable; +import com.sun.jersey.spi.inject.PerRequestTypeInjectableProvider; + +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.Provider; +import org.joda.time.LocalDate; +import java.util.List; + +@Provider +public class JodaLocalDateProvider extends PerRequestTypeInjectableProvider { + private final UriInfo uriInfo; + + public JodaLocalDateProvider(@Context UriInfo uriInfo) { + super(LocalDate.class); + this.uriInfo = uriInfo; + } + + @Override + public Injectable getInjectable(final ComponentContext cc, final QueryParam a) { + return new Injectable() { + @Override + public LocalDate getValue() { + final List values = uriInfo.getQueryParameters().get(a.value()); + + if (values == null || values.isEmpty()) + return null; + if (values.size() > 1) { + throw new WebApplicationException(Response.status(Status.BAD_REQUEST). + entity(a.value() + " cannot contain multiple values").build()); + } + + return LocalDate.parse(values.get(0)); + } + }; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/LocalDateProvider.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/LocalDateProvider.mustache new file mode 100644 index 000000000000..8c4cd4cbd157 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/LocalDateProvider.mustache @@ -0,0 +1,44 @@ +package {{apiPackage}}; + +import com.sun.jersey.core.spi.component.ComponentContext; +import com.sun.jersey.spi.inject.Injectable; +import com.sun.jersey.spi.inject.PerRequestTypeInjectableProvider; + +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.Provider; +import java.time.LocalDate; +import java.util.List; + +@Provider +public class LocalDateProvider extends PerRequestTypeInjectableProvider { + private final UriInfo uriInfo; + + public LocalDateProvider(@Context UriInfo uriInfo) { + super(LocalDate.class); + this.uriInfo = uriInfo; + } + + @Override + public Injectable getInjectable(final ComponentContext cc, final QueryParam a) { + return new Injectable() { + @Override + public LocalDate getValue() { + final List values = uriInfo.getQueryParameters().get(a.value()); + + if (values == null || values.isEmpty()) + return null; + if (values.size() > 1) { + throw new WebApplicationException(Response.status(Status.BAD_REQUEST). + entity(a.value() + " cannot contain multiple values").build()); + } + + return LocalDate.parse(values.get(0)); + } + }; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/LocalDateTimeProvider.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/LocalDateTimeProvider.mustache new file mode 100644 index 000000000000..93bb6f19d506 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/LocalDateTimeProvider.mustache @@ -0,0 +1,44 @@ +package {{apiPackage}}; + +import com.sun.jersey.core.spi.component.ComponentContext; +import com.sun.jersey.spi.inject.Injectable; +import com.sun.jersey.spi.inject.PerRequestTypeInjectableProvider; + +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.Provider; +import java.time.LocalDateTime; +import java.util.List; + +@Provider +public class LocalDateTimeProvider extends PerRequestTypeInjectableProvider { + private final UriInfo uriInfo; + + public LocalDateTimeProvider(@Context UriInfo uriInfo) { + super(LocalDateTime.class); + this.uriInfo = uriInfo; + } + + @Override + public Injectable getInjectable(final ComponentContext cc, final QueryParam a) { + return new Injectable() { + @Override + public LocalDateTime getValue() { + final List values = uriInfo.getQueryParameters().get(a.value()); + + if (values == null || values.isEmpty()) + return null; + if (values.size() > 1) { + throw new WebApplicationException(Response.status(Status.BAD_REQUEST). + entity(a.value() + " cannot contain multiple values").build()); + } + + return LocalDateTime.parse(values.get(0)); + } + }; + } +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/NotFoundException.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/NotFoundException.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/NotFoundException.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/NotFoundException.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/README.mustache similarity index 84% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/README.mustache index f240464851d2..3551b9e99149 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/README.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/README.mustache @@ -2,7 +2,7 @@ ## Overview This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This is an example of building a swagger-enabled JAX-RS server. This example uses the [JAX-RS](https://jax-rs-spec.java.net/) framework. @@ -16,7 +16,7 @@ mvn clean package jetty:run You can then view the swagger listing here: ``` -http://localhost:8080{{contextPath}}/swagger.json +http://localhost:{{serverPort}}{{contextPath}}/swagger.json ``` Note that if you have configured the `host` to be something other than localhost, the calls through diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/StringUtil.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/StringUtil.mustache new file mode 100644 index 000000000000..073966b0c217 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/StringUtil.mustache @@ -0,0 +1,42 @@ +package {{invokerPackage}}; + +{{>generatedAnnotation}} +public class StringUtil { + /** + * Check if the given array contains the given value (with case-insensitive comparison). + * + * @param array The array + * @param value The value to search + * @return true if the array contains the value + */ + public static boolean containsIgnoreCase(String[] array, String value) { + for (String str : array) { + if (value == null && str == null) return true; + if (value != null && value.equalsIgnoreCase(str)) return true; + } + return false; + } + + /** + * Join an array of strings with the given separator. + *

+ * Note: This might be replaced by utility method from commons-lang or guava someday + * if one of those libraries is added as dependency. + *

+ * + * @param array The array of strings + * @param separator The separator + * @return the resulting string + */ + public static String join(String[] array, String separator) { + int len = array.length; + if (len == 0) return ""; + + StringBuilder out = new StringBuilder(); + out.append(array[0]); + for (int i = 1; i < len; i++) { + out.append(separator).append(array[i]); + } + return out.toString(); + } +} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/allowableValues.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/allowableValues.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/allowableValues.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/allowableValues.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/api.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/api.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/api.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/apiService.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/apiService.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/apiService.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/apiService.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/apiServiceFactory.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/apiServiceFactory.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/apiServiceFactory.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/apiServiceFactory.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/apiServiceImpl.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/apiServiceImpl.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/apiServiceImpl.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/apiServiceImpl.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/bodyParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/bodyParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/bodyParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/bodyParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/enumClass.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/enumClass.mustache new file mode 100644 index 000000000000..6010e26704f5 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/enumClass.mustache @@ -0,0 +1,17 @@ + + public enum {{{datatypeWithEnum}}} { + {{#allowableValues}}{{#enumVars}}{{{name}}}("{{{value}}}"){{^-last}}, + {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} + + private String value; + + {{{datatypeWithEnum}}}(String value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return value; + } + } diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/enumOuterClass.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/enumOuterClass.mustache new file mode 100644 index 000000000000..7aea7b92f22f --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/enumOuterClass.mustache @@ -0,0 +1,3 @@ +public enum {{classname}} { + {{#allowableValues}}{{.}}{{^-last}}, {{/-last}}{{/allowableValues}} +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/formParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/formParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/formParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/formParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/generatedAnnotation.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/generatedAnnotation.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/generatedAnnotation.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/generatedAnnotation.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/headerParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/headerParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/headerParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/headerParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/model.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/model.mustache new file mode 100644 index 000000000000..005d63991daf --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/model.mustache @@ -0,0 +1,15 @@ +package {{package}}; + +{{#imports}}import {{import}}; +{{/imports}} + +{{#serializableModel}}import java.io.Serializable;{{/serializableModel}} +{{#models}} +{{#model}}{{#description}} +/** + * {{description}} + **/{{/description}} +{{#isEnum}}{{>enumOuterClass}}{{/isEnum}} +{{^isEnum}}{{>pojo}}{{/isEnum}} +{{/model}} +{{/models}} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/pathParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pathParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/pathParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pathParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pojo.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pojo.mustache new file mode 100644 index 000000000000..eea33d346d4d --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pojo.mustache @@ -0,0 +1,68 @@ +{{#description}}@ApiModel(description = "{{{description}}}"){{/description}} +{{>generatedAnnotation}} +public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { + {{#vars}}{{#isEnum}} + +{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} + +{{>enumClass}}{{/items}}{{/items.isEnum}} + private {{{datatypeWithEnum}}} {{name}} = {{{defaultValue}}};{{/vars}} + + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + {{#vendorExtensions.extraAnnotation}}{{vendorExtensions.extraAnnotation}}{{/vendorExtensions.extraAnnotation}} + @ApiModelProperty({{#required}}required = {{required}}, {{/required}}value = "{{{description}}}") + @JsonProperty("{{baseName}}") + public {{{datatypeWithEnum}}} {{getter}}() { + return {{name}}; + } + public void {{setter}}({{{datatypeWithEnum}}} {{name}}) { + this.{{name}} = {{name}}; + } + + {{/vars}} + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + {{classname}} {{classVarName}} = ({{classname}}) o;{{#hasVars}} + return {{#vars}}Objects.equals({{name}}, {{classVarName}}.{{name}}){{#hasMore}} && + {{/hasMore}}{{^hasMore}};{{/hasMore}}{{/vars}}{{/hasVars}}{{^hasVars}} + return true;{{/hasVars}} + } + + @Override + public int hashCode() { + return Objects.hash({{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class {{classname}} {\n"); + {{#parent}}sb.append(" ").append(toIndentedString(super.toString())).append("\n");{{/parent}} + {{#vars}}sb.append(" {{name}}: ").append(toIndentedString({{name}})).append("\n"); + {{/vars}}sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } +} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pom.mustache similarity index 99% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pom.mustache index b8426a0a6931..0d1b06de43a0 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/pom.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/pom.mustache @@ -37,7 +37,7 @@ 8079 stopit - 8080 + {{serverPort}} 60000 diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/build.properties b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/project/build.properties similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/project/build.properties rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/project/build.properties diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/project/plugins.sbt b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/project/plugins.sbt similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/project/plugins.sbt rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/project/plugins.sbt diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/queryParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/queryParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/queryParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/queryParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/returnTypes.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/returnTypes.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/returnTypes.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/returnTypes.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceBodyParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceBodyParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceBodyParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceBodyParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceFormParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceFormParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceFormParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceFormParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceHeaderParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceHeaderParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceHeaderParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceHeaderParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/servicePathParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/servicePathParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/servicePathParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/servicePathParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceQueryParams.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceQueryParams.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/serviceQueryParams.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/serviceQueryParams.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/web.mustache similarity index 100% rename from modules/swagger-codegen/src/main/resources/JavaJaxRS/web.mustache rename to modules/swagger-codegen/src/main/resources/JavaJaxRS/jersey1_18/web.mustache diff --git a/modules/swagger-codegen/src/main/resources/JavaSpringMVC/README.mustache b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/README.mustache index 9cf2b4bc6e80..1354151afbbe 100644 --- a/modules/swagger-codegen/src/main/resources/JavaSpringMVC/README.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/README.mustache @@ -4,7 +4,7 @@ Spring MVC Server ## Overview -This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the [swagger-spec](https://github.com/swagger-api/swagger-core), you can easily generate a server stub. This is an example of building a swagger-enabled server in Java using the Spring MVC framework. +This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the [OpenAPI-Spec](https://github.com/swagger-api/swagger-core), you can easily generate a server stub. This is an example of building a swagger-enabled server in Java using the Spring MVC framework. The underlying library integrating swagger to Spring-MVC is [springfox](https://github.com/springfox/springfox) diff --git a/modules/swagger-codegen/src/main/resources/JavaSpringMVC/api-j8-async.mustache b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/api-j8-async.mustache new file mode 100755 index 000000000000..b11e5c2db202 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/api-j8-async.mustache @@ -0,0 +1,64 @@ +package {{apiPackage}}; + +import {{modelPackage}}.*; + +{{#imports}}import {{import}}; +{{/imports}} + +import java.util.concurrent.Callable; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import io.swagger.annotations.Authorization; +import io.swagger.annotations.AuthorizationScope; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +import static org.springframework.http.MediaType.*; + +@Controller +@RequestMapping(value = "/{{baseName}}", produces = {APPLICATION_JSON_VALUE}) +@Api(value = "/{{baseName}}", description = "the {{baseName}} API") +{{>generatedAnnotation}} +{{#operations}} +public interface {{classname}} { + {{#operation}} + + @ApiOperation(value = "{{{summary}}}", notes = "{{{notes}}}", response = {{{returnType}}}.class{{#returnContainer}}, responseContainer = "{{{returnContainer}}}"{{/returnContainer}}{{#hasAuthMethods}}, authorizations = { + {{#authMethods}}@Authorization(value = "{{name}}"{{#isOAuth}}, scopes = { + {{#scopes}}@AuthorizationScope(scope = "{{scope}}", description = "{{description}}"){{#hasMore}}, + {{/hasMore}}{{/scopes}} + }{{/isOAuth}}){{#hasMore}}, + {{/hasMore}}{{/authMethods}} + }{{/hasAuthMethods}}) + @ApiResponses(value = { {{#responses}} + @ApiResponse(code = {{{code}}}, message = "{{{message}}}"){{#hasMore}},{{/hasMore}}{{/responses}} }) + @RequestMapping(value = "{{path}}", + {{#hasProduces}}produces = { {{#produces}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }, {{/hasProduces}} + {{#hasConsumes}}consumes = { {{#consumes}}"{{mediaType}}"{{#hasMore}}, {{/hasMore}}{{/consumes}} },{{/hasConsumes}} + method = RequestMethod.{{httpMethod}}) + default CallablereturnTypes}}>> {{operationId}}({{#allParams}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}}, + {{/hasMore}}{{/allParams}}) + throws NotFoundException { + // do some magic! + return () -> new ResponseEntity<{{>returnTypes}}>(HttpStatus.OK); + } + + {{/operation}} +} +{{/operations}} diff --git a/modules/swagger-codegen/src/main/resources/JavaSpringMVC/pom-j8-async.mustache b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/pom-j8-async.mustache new file mode 100644 index 000000000000..566a4c83d8de --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/JavaSpringMVC/pom-j8-async.mustache @@ -0,0 +1,172 @@ + + 4.0.0 + {{groupId}} + {{artifactId}} + jar + {{artifactId}} + {{artifactVersion}} + + src/main/java + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + maven-failsafe-plugin + 2.6 + + + + integration-test + verify + + + + + + org.eclipse.jetty + jetty-maven-plugin + ${jetty-version} + + + {{^contextPath}}/{{/contextPath}}{{#contextPath}}{{contextPath}}{{/contextPath}} + + target/${project.artifactId}-${project.version} + 8079 + stopit + + 8002 + 60000 + + + + + start-jetty + pre-integration-test + + start + + + 0 + true + + + + stop-jetty + post-integration-test + + stop + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + 1.8 + 1.8 + + + + + + + io.swagger + swagger-jersey-jaxrs + ${swagger-core-version} + + + org.slf4j + slf4j-log4j12 + ${slf4j-version} + + + com.sun.jersey + jersey-core + ${jersey-version} + + + com.sun.jersey + jersey-json + ${jersey-version} + + + com.sun.jersey + jersey-servlet + ${jersey-version} + + + com.sun.jersey.contribs + jersey-multipart + ${jersey-version} + + + com.sun.jersey + jersey-server + ${jersey-version} + + + + + org.springframework + spring-core + ${spring-version} + + + org.springframework + spring-webmvc + ${spring-version} + + + org.springframework + spring-web + ${spring-version} + + + + + io.springfox + springfox-swagger2 + ${springfox-version} + + + io.springfox + springfox-swagger-ui + ${springfox-version} + + + + junit + junit + ${junit-version} + test + + + javax.servlet + servlet-api + ${servlet-api-version} + + + + + jcenter-snapshots + jcenter + http://oss.jfrog.org/artifactory/oss-snapshot-local/ + + + + 1.5.4 + 9.2.9.v20150224 + 1.13 + 1.6.3 + 1.6.1 + 4.8.1 + 2.5 + 2.0.4-SNAPSHOT + 4.0.9.RELEASE + + \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache index f7bc498ff189..9957fc4e2c51 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/api.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/api.mustache @@ -1,17 +1,20 @@ -/* - * {{>generatedAnnotation}} - */ +// require files in Node.js environment +var ${{#imports}}, {{import}}{{/imports}}; +if (typeof module === 'object' && module.exports) { + $ = require('jquery');{{#imports}} + {{import}} = require('../model/{{import}}.js');{{/imports}} +} -//export module +// export module for AMD if ( typeof define === "function" && define.amd ) { - define(['jquery'], function($) { + define(['jquery'{{#imports}}, '{{import}}'{{/imports}}], function(${{#imports}}, {{import}}{{/imports}}) { return {{classname}}; }); } var {{classname}} = function {{classname}}() { var self = this; -{{#operations}} + {{#operations}} {{#operation}} /** * {{summary}} @@ -21,7 +24,6 @@ var {{classname}} = function {{classname}}() { * @return {{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}} */ self.{{nickname}} = function({{#allParams}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}{{#hasParams}}, {{/hasParams}}callback) { - var {{localVariablePrefix}}postBody = {{#bodyParam}}{{^isBinary}}JSON.stringify({{paramName}}){{/isBinary}}{{#isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; var {{localVariablePrefix}}postBinaryBody = {{#bodyParam}}{{#isBinary}}{{paramName}}{{/isBinary}}{{^isBinary}}null{{/isBinary}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}; {{#allParams}}{{#required}} @@ -39,8 +41,8 @@ var {{classname}} = function {{classname}}() { basePath = basePath.substring(0, basePath.length-1); } - var {{localVariablePrefix}}path = basePath + replaceAll(replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} -, "\\{" + "{{baseName}}" + "\\}", {{localVariablePrefix}}apiClient.escapeString({{{paramName}}}.toString()){{/pathParams}}); + var {{localVariablePrefix}}path = basePath + replaceAll(replaceAll("{{{path}}}", "\\{format\\}","json"){{#pathParams}} +, "\\{" + "{{baseName}}" + "\\}", encodeURIComponent({{{paramName}}}.toString()){{/pathParams}}); var queryParams = {}; var headerParams = {}; @@ -50,58 +52,46 @@ var {{classname}} = function {{classname}}() { queryParams.{{baseName}} = {{paramName}}; {{/queryParams}} {{#headerParams}}if ({{paramName}} != null) - {{localVariablePrefix}}headerParams.put("{{baseName}}", {{localVariablePrefix}}apiClient.parameterToString({{paramName}})); + {{localVariablePrefix}}headerParams.put("{{baseName}}", {{paramName}}); {{/headerParams}} {{#formParams}}if ({{paramName}} != null) {{localVariablePrefix}}formParams.put("{{baseName}}", {{paramName}}); {{/formParams}} - path += createQueryString(queryParams); + path += createQueryString(queryParams); - //if (console) { - //console.log('path: ' + path); - //console.log('queryParams: ' + queryParams); - //} - - {{#isResponseBinary}} - byte[] {{localVariablePrefix}}response = null; - {{localVariablePrefix}}response = {{localVariablePrefix}}apiClient.invokeBinaryAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams,{{localVariablePrefix}} postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames); - return {{localVariablePrefix}}response; - {{/isResponseBinary}} - - {{^isResponseBinary}} - {{#returnType}} - //TypeRef {{localVariablePrefix}}returnType = new TypeRef<{{{returnType}}}>() {}; - //return {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, {{localVariablePrefix}}returnType); - - var options = {type: "{{httpMethod}}", async: true, contentType: "application/json", dataType: "json", data: postBody}; + var options = {type: "{{httpMethod}}", async: true, contentType: "application/json", dataType: "json", data: postBody}; var request = $.ajax(path, options); - //request.fail(function(jqXHR, textStatus, errorThrown){ - // errorHandler(jqXHR, textStatus, errorThrown); - //}); - - - request.done(function(response, textStatus, jqXHR){ - /** - * @returns {{{returnType}}} - */ - {{#returnTypeIsPrimitive}} var myResponse = response;{{/returnTypeIsPrimitive}} - {{^returnTypeIsPrimitive}} var myResponse = new {{{returnType}}}(); - myResponse.constructFromObject(response);{{/returnTypeIsPrimitive}} - - callback(myResponse, textStatus, jqXHR); - }); - - {{/returnType}}{{^returnType}} - {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, "{{httpMethod}}", {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}postBinaryBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, null); - {{/returnType}} - {{/isResponseBinary}} - + request.fail(function(jqXHR, textStatus, errorThrown){ + if (callback) { + var error = errorThrown || textStatus || jqXHR.statusText || 'error'; + callback(null, textStatus, jqXHR, error); + } + }); + + request.done(function(response, textStatus, jqXHR){ + {{#returnType}} + /** + * @returns {{{returnType}}} + */ + {{#returnTypeIsPrimitive}}var myResponse = response;{{/returnTypeIsPrimitive}} + {{^returnTypeIsPrimitive}}var myResponse = new {{{returnType}}}(); + myResponse.constructFromObject(response);{{/returnTypeIsPrimitive}} + if (callback) { + callback(myResponse, textStatus, jqXHR); + } + {{/returnType}}{{^returnType}} + if (callback) { + callback(response, textStatus, jqXHR); + } + {{/returnType}} + }); + + return request; } {{/operation}} - -{{/operations}} + {{/operations}} function replaceAll (haystack, needle, replace) { var result= haystack; @@ -128,3 +118,8 @@ var {{classname}} = function {{classname}}() { return queryString; } } + +// export module for Node.js +if (typeof module === 'object' && module.exports) { + module.exports = {{classname}}; +} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache b/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache deleted file mode 100644 index 49110fc1ad93..000000000000 --- a/modules/swagger-codegen/src/main/resources/Javascript/generatedAnnotation.mustache +++ /dev/null @@ -1 +0,0 @@ -@javax.annotation.Generated(value = "{{generatorClass}}", date = "{{generatedDate}}") \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Javascript/index.mustache b/modules/swagger-codegen/src/main/resources/Javascript/index.mustache new file mode 100644 index 000000000000..a0207a6cc916 --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/index.mustache @@ -0,0 +1,10 @@ +if (typeof module === 'object' && module.exports) { + var {{moduleName}} = {}; + {{#models}} + {{moduleName}}.{{importPath}} = require('./model/{{importPath}}.js'); + {{/models}} + {{#apiInfo}}{{#apis}} + {{moduleName}}.{{importPath}} = require('./api/{{importPath}}.js'); + {{/apis}}{{/apiInfo}} + module.exports = {{moduleName}}; +} \ No newline at end of file diff --git a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache index acf0bcffc195..0588d03a8c13 100644 --- a/modules/swagger-codegen/src/main/resources/Javascript/model.mustache +++ b/modules/swagger-codegen/src/main/resources/Javascript/model.mustache @@ -1,37 +1,48 @@ +// require files in Node.js environment +{{#imports}} +var {{import}};{{/imports}} +if (typeof module === 'object' && module.exports) { + {{#imports}} + {{import}} = require('./{{import}}.js');{{/imports}} +} + {{#models}}{{#model}} {{#vars}}{{#isEnum}}{{>enumClass}}{{/isEnum}}{{#items.isEnum}}{{#items}} {{>enumClass}}{{/items}}*/{{/items.isEnum}}{{/vars}} //export module -if ( typeof define === "function" && define.amd ) { - define('{{classname}}', ['jquery'{{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}'{{datatypeWithEnum}}'{{/isPrimitiveType}}{{/vars}}], - function(${{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}{{datatypeWithEnum}}{{/isPrimitiveType}}{{/vars}}) { - return {{classname}}; - }); +if ( typeof define === "function" && define.amd ) { + define('{{classname}}', ['jquery'{{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}'{{datatypeWithEnum}}'{{/isPrimitiveType}}{{/vars}}], + function(${{#vars}}{{^isPrimitiveType}}{{^-last}}, {{/-last}}{{datatypeWithEnum}}{{/isPrimitiveType}}{{/vars}}) { + return {{classname}}; + }); } {{#description}}/** * {{description}} **/{{/description}} var {{classname}} = function {{classname}}({{#mandatory}}{{this}}{{^-last}}, {{/-last}}{{/mandatory}}) { {{#parent}}/* extends {{{parent}}}*/{{/parent}} - var self = this; - {{#vars}} - /**{{#description}} - * {{{description}}}{{/description}} - * datatype: {{{datatypeWithEnum}}}{{#required}} - * required{{/required}}{{#minimum}} - * minimum: {{minimum}}{{/minimum}}{{#maximum}} - * maximum: {{maximum}}{{/maximum}} - **/ - self.{{name}} = {{#required}}{{name}}{{/required}}{{^required}}{{{defaultValue}}}{{/required}}; - {{/vars}} - - self.constructFromObject = function(data) { - {{#vars}} - self.{{name}}{{{defaultValueWithParam}}} - {{/vars}} - } + var self = this; + {{#vars}} + /**{{#description}} + * {{{description}}}{{/description}} + * datatype: {{{datatypeWithEnum}}}{{#required}} + * required{{/required}}{{#minimum}} + * minimum: {{minimum}}{{/minimum}}{{#maximum}} + * maximum: {{maximum}}{{/maximum}} + **/ + self.{{name}} = {{#required}}{{name}}{{/required}}{{^required}}{{{defaultValue}}}{{/required}}; + {{/vars}} + self.constructFromObject = function(data) { + if (!data) { + return; + } + {{#vars}} + self.{{name}}{{{defaultValueWithParam}}} + {{/vars}} + } + {{#vars}} /**{{#description}} * get {{{description}}}{{/description}}{{#minimum}} @@ -42,7 +53,7 @@ var {{classname}} = function {{classname}}({{#mandatory}}{{this}}{{^-last}}, {{/ self.{{getter}} = function() { return self.{{name}}; } - + /**{{#description}} * set {{{description}}}{{/description}} * @param {{=<% %>=}}{<% datatypeWithEnum %>}<%={{ }}=%> {{name}} @@ -53,8 +64,12 @@ var {{classname}} = function {{classname}}({{#mandatory}}{{this}}{{^-last}}, {{/ {{/vars}} self.toJson = function () { - return JSON.stringify(self); + return JSON.stringify(self); } } + +if (typeof module === 'object' && module.exports) { + module.exports = {{classname}}; +} {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/Javascript/package.mustache b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache new file mode 100644 index 000000000000..c77ee835709e --- /dev/null +++ b/modules/swagger-codegen/src/main/resources/Javascript/package.mustache @@ -0,0 +1,20 @@ +{ + "name": "{{{projectName}}}", + "version": "{{{projectVersion}}}", + "description": "{{{projectDescription}}}",{{#projectLicenseName}} + "license": "{{{projectLicenseName}}}",{{/projectLicenseName}} + "main": "{{sourceFolder}}/index.js", + "scripts": { + "test": "./node_modules/mocha/bin/mocha --recursive" + }, + "dependencies": { + "jquery": "~2.1.4" + }, + "devDependencies": { + "mocha": "~2.3.4", + "expect.js": "~0.3.1", + "mockrequire": "~0.0.5", + "domino": "~1.0.20", + "xmlhttprequest": "~1.8.0" + } +} diff --git a/modules/swagger-codegen/src/main/resources/codegen/README.mustache b/modules/swagger-codegen/src/main/resources/codegen/README.mustache index a434038ec411..268a84a0edd1 100644 --- a/modules/swagger-codegen/src/main/resources/codegen/README.mustache +++ b/modules/swagger-codegen/src/main/resources/codegen/README.mustache @@ -9,7 +9,7 @@ your changes applied. The goal of Swaggerâ„¢ is to define a standard, language-agnostic interface to REST APIs which allows both humans and computers to discover and understand the capabilities of the service without access to source code, documentation, or through network traffic inspection. When properly defined via Swagger, a consumer can understand and interact with the remote service with a minimal amount of implementation logic. Similar to what interfaces have done for lower-level programming, Swagger removes the guesswork in calling the service. -Check out [Swagger-Spec](https://github.com/swagger-api/swagger-spec) for additional information about the Swagger project, including additional libraries with support for other languages and more. +Check out [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) for additional information about the Swagger project, including additional libraries with support for other languages and more. ## How do I use this? At this point, you've likely generated a client setup. It will include something along these lines: @@ -62,7 +62,7 @@ the object you have available during client generation: ``` # The following additional debug options are available for all codegen targets: -# -DdebugSwagger prints the swagger specification as interpreted by the codegen +# -DdebugSwagger prints the OpenAPI Specification as interpreted by the codegen # -DdebugModels prints models passed to the template engine # -DdebugOperations prints operations passed to the template engine # -DdebugSupportingFiles prints additional data passed to the template engine diff --git a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache index db865e2b27d4..142b2e6bbb98 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/ApiClient.mustache @@ -232,13 +232,16 @@ namespace {{packageName}}.Client var filePath = String.IsNullOrEmpty(Configuration.TempFolderPath) ? Path.GetTempPath() : Configuration.TempFolderPath; - var regex = new Regex(@"Content-Disposition:.*filename=['""]?([^'""\s]+)['""]?$"); - var match = regex.Match(headers.ToString()); - if (match.Success) + var regex = new Regex(@"Content-Disposition=.*filename=['""]?([^'""\s]+)['""]?$"); + foreach (var header in headers) { - string fileName = filePath + match.Value.Replace("\"", "").Replace("'", ""); - File.WriteAllBytes(fileName, data); - return new FileStream(fileName, FileMode.Open); + var match = regex.Match(header.ToString()); + if (match.Success) + { + string fileName = filePath + match.Groups[1].Value.Replace("\"", "").Replace("'", ""); + File.WriteAllBytes(fileName, data); + return new FileStream(fileName, FileMode.Open); + } } } var stream = new MemoryStream(data); diff --git a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache index b5ebd08ba877..7062a73c1e1c 100644 --- a/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/csharp/Configuration.mustache @@ -24,15 +24,16 @@ namespace {{packageName}}.Client /// Dictionary of API key prefix /// Temp folder path /// DateTime format string - public Configuration(ApiClient apiClient, - Dictionary defaultHeader, - string username, - string password, - string accessToken, - Dictionary apiKey, - Dictionary apiKeyPrefix, - string tempFolderPath, - string dateTimeFormat + public Configuration(ApiClient apiClient = null, + Dictionary defaultHeader = null, + string username = null, + string password = null, + string accessToken = null, + Dictionary apiKey = null, + Dictionary apiKeyPrefix = null, + string tempFolderPath = null, + string dateTimeFormat = null, + int timeout = 100000 ) { if (apiClient == null) @@ -43,19 +44,24 @@ namespace {{packageName}}.Client Username = username; Password = password; AccessToken = accessToken; - ApiKey = apiKey; - ApiKeyPrefix = apiKeyPrefix; + + if (defaultHeader != null) + DefaultHeader = defaultHeader; + if (apiKey != null) + ApiKey = apiKey; + if (apiKeyPrefix != null) + ApiKeyPrefix = apiKeyPrefix; TempFolderPath = tempFolderPath; DateTimeFormat = dateTimeFormat; - + Timeout = timeout; } /// /// Initializes a new instance of the Configuration class. /// /// Api client. - public Configuration(ApiClient apiClient=null) + public Configuration(ApiClient apiClient) { if (apiClient == null) ApiClient = ApiClient.Default; @@ -75,20 +81,39 @@ namespace {{packageName}}.Client /// Configuration. public static Configuration Default = new Configuration(); + /// + /// Gets or sets the HTTP timeout (milliseconds) of ApiClient. Default to 100000 milliseconds. + /// + /// Timeout. + public int Timeout + { + get { return ApiClient.RestClient.Timeout; } + + set + { + ApiClient.RestClient.Timeout = value; + } + } + /// /// Gets or sets the default API client for making HTTP calls. /// /// The API client. public ApiClient ApiClient; - private readonly Dictionary _defaultHeaderMap = new Dictionary(); + private Dictionary _defaultHeaderMap = new Dictionary(); /// - /// Gets the default header. + /// Gets or sets the default header. /// public Dictionary DefaultHeader { get { return _defaultHeaderMap; } + + set + { + _defaultHeaderMap = value; + } } /// diff --git a/modules/swagger-codegen/src/main/resources/flaskConnexion/README.mustache b/modules/swagger-codegen/src/main/resources/flaskConnexion/README.mustache index ed64b6675587..7e80a2086ef5 100644 --- a/modules/swagger-codegen/src/main/resources/flaskConnexion/README.mustache +++ b/modules/swagger-codegen/src/main/resources/flaskConnexion/README.mustache @@ -2,7 +2,7 @@ ## Overview This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This is an example of building a swagger-enabled flask server. This example uses the [connexion](https://github.com/zalando/connexion) library on top of Flask. diff --git a/modules/swagger-codegen/src/main/resources/nodejs/README.mustache b/modules/swagger-codegen/src/main/resources/nodejs/README.mustache index edeea0005c06..d94aa385ec03 100644 --- a/modules/swagger-codegen/src/main/resources/nodejs/README.mustache +++ b/modules/swagger-codegen/src/main/resources/nodejs/README.mustache @@ -1,11 +1,11 @@ # Swagger generated server ## Overview -This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the [swagger-spec](https://github.com/swagger-api/swagger-spec) from a remote server, you can easily generate a server stub. This is an example of building a node.js server. +This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub. This is an example of building a node.js server. This example uses the [expressjs](http://expressjs.com/) framework. To see how to make this your own, look here: -[README](https://github.com/swagger-api/swagger-codegen/README.md) +[README](https://github.com/swagger-api/swagger-codegen/blob/master/README.md) ### Running the server To run the server, follow these simple steps: @@ -21,4 +21,4 @@ To view the Swagger UI interface: open http://localhost:8080/docs ``` -This project leverages the mega-awesome [swagger-tools](https://github.com/apigee-127/swagger-tools) middleware which does most all the work. \ No newline at end of file +This project leverages the mega-awesome [swagger-tools](https://github.com/apigee-127/swagger-tools) middleware which does most all the work. diff --git a/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache b/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache index 1623721cc70d..4d7d5bb70882 100644 --- a/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache +++ b/modules/swagger-codegen/src/main/resources/perl/ApiClient.mustache @@ -345,7 +345,7 @@ sub update_params_for_auth { # The endpoint API class has not found any settings for auth. This may be deliberate, # in which case update_params_for_auth() will be a no-op. But it may also be that the -# swagger spec does not describe the intended authorization. So we check in the config for any +# OpenAPI Spec does not describe the intended authorization. So we check in the config for any # auth tokens and if we find any, we use them for all endpoints; sub _global_auth_setup { my ($self, $header_params, $query_params) = @_; diff --git a/modules/swagger-codegen/src/main/resources/perl/BaseObject.mustache b/modules/swagger-codegen/src/main/resources/perl/BaseObject.mustache index a41931940bae..aed1aec3118a 100644 --- a/modules/swagger-codegen/src/main/resources/perl/BaseObject.mustache +++ b/modules/swagger-codegen/src/main/resources/perl/BaseObject.mustache @@ -1,25 +1,3 @@ -package WWW::{{moduleName}}::Object::BaseObject; - -require 5.6.0; -use strict; -use warnings; -use utf8; -use JSON qw(decode_json); -use Data::Dumper; -use Module::Runtime qw(use_module); -use Log::Any qw($log); -use Date::Parse; -use DateTime; - -use base ("Class::Accessor", "Class::Data::Inheritable"); - - -# -# -# -#NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. -# - __PACKAGE__->mk_classdata('attribute_map' => {}); __PACKAGE__->mk_classdata('swagger_types' => {}); __PACKAGE__->mk_classdata('method_documentation' => {}); @@ -95,4 +73,3 @@ sub _deserialize { } } -1; diff --git a/modules/swagger-codegen/src/main/resources/perl/README.md b/modules/swagger-codegen/src/main/resources/perl/README.mustache similarity index 97% rename from modules/swagger-codegen/src/main/resources/perl/README.md rename to modules/swagger-codegen/src/main/resources/perl/README.mustache index 8d0b7695c153..ac94b5b06380 100644 --- a/modules/swagger-codegen/src/main/resources/perl/README.md +++ b/modules/swagger-codegen/src/main/resources/perl/README.mustache @@ -20,7 +20,7 @@ WWW::{{moduleName}}::ApiFactory for non-Moosey usage. # SYNOPSIS The Perl Swagger Codegen project builds a library of Perl modules to interact with -a web service defined by a Swagger specification. See below for how to build the +a web service defined by a OpenAPI Specification. See below for how to build the library. This module provides an interface to the generated library. All the classes, @@ -56,7 +56,7 @@ For documentation of all these methods, see AUTOMATIC DOCUMENTATION below. ## Configuring authentication -In the normal case, the Swagger spec will describe what parameters are +In the normal case, the OpenAPI Spec will describe what parameters are required and where to put them. You just need to supply the tokens. my $tokens = { @@ -203,7 +203,7 @@ output formats are supported: The `-c` option allows you to load and inspect your own application. A dummy namespace is used if you don't supply your own class. -# DOCUMENTATION FROM THE SWAGGER SPEC +# DOCUMENTATION FROM THE OpenAPI Spec Additional documentation for each class and method may be provided by the Swagger spec. If so, this is available via the `class_documentation()` and diff --git a/modules/swagger-codegen/src/main/resources/perl/Role.mustache b/modules/swagger-codegen/src/main/resources/perl/Role.mustache index 7bca8cca78d7..ac2298a08e9f 100644 --- a/modules/swagger-codegen/src/main/resources/perl/Role.mustache +++ b/modules/swagger-codegen/src/main/resources/perl/Role.mustache @@ -119,7 +119,7 @@ WWW::{{moduleName}}::ApiFactory for non-Moosey usage. =head1 SYNOPSIS The Perl Swagger Codegen project builds a library of Perl modules to interact with -a web service defined by a Swagger specification. See below for how to build the +a web service defined by a OpenAPI Specification. See below for how to build the library. This module provides an interface to the generated library. All the classes, @@ -154,7 +154,7 @@ For documentation of all these methods, see AUTOMATIC DOCUMENTATION below. =head2 Configuring authentication -In the normal case, the Swagger spec will describe what parameters are +In the normal case, the OpenAPI Spec will describe what parameters are required and where to put them. You just need to supply the tokens. my $tokens = { @@ -304,7 +304,7 @@ output formats are supported: The C<-c> option allows you to load and inspect your own application. A dummy namespace is used if you don't supply your own class. -=head1 DOCUMENTATION FROM THE SWAGGER SPEC +=head1 DOCUMENTATION FROM THE OpenAPI Spec Additional documentation for each class and method may be provided by the Swagger spec. If so, this is available via the C and diff --git a/modules/swagger-codegen/src/main/resources/perl/object.mustache b/modules/swagger-codegen/src/main/resources/perl/object.mustache index 00c572453c1e..d2e1b2a2a505 100644 --- a/modules/swagger-codegen/src/main/resources/perl/object.mustache +++ b/modules/swagger-codegen/src/main/resources/perl/object.mustache @@ -13,7 +13,8 @@ use Log::Any qw($log); use Date::Parse; use DateTime; -use base "WWW::{{moduleName}}::Object::BaseObject"; +use base ("Class::Accessor", "Class::Data::Inheritable"); + # #{{description}} @@ -21,6 +22,8 @@ use base "WWW::{{moduleName}}::Object::BaseObject"; #NOTE: This class is auto generated by the swagger code generator program. Do not edit the class manually. # +{{>BaseObject}} + __PACKAGE__->class_documentation({description => '{{description}}', class => '{{classname}}', required => [], # TODO @@ -49,6 +52,7 @@ __PACKAGE__->attribute_map( { __PACKAGE__->mk_accessors(keys %{__PACKAGE__->attribute_map}); + 1; {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/php/api.mustache b/modules/swagger-codegen/src/main/resources/php/api.mustache index cce59f4d94b5..23855792e6d7 100644 --- a/modules/swagger-codegen/src/main/resources/php/api.mustache +++ b/modules/swagger-codegen/src/main/resources/php/api.mustache @@ -213,7 +213,7 @@ use \{{invokerPackage}}\ObjectSerializer; {{/returnType}} } catch (ApiException $e) { switch ($e->getCode()) { {{#responses}}{{#dataType}} - case {{code}}: + {{^isWildcard}}case {{code}}:{{/isWildcard}}{{#isWildcard}}default:{{/isWildcard}} $data = $this->apiClient->getSerializer()->deserialize($e->getResponseBody(), '{{dataType}}', $e->getResponseHeaders()); $e->setResponseObject($data); break;{{/dataType}}{{/responses}} diff --git a/modules/swagger-codegen/src/main/resources/php/configuration.mustache b/modules/swagger-codegen/src/main/resources/php/configuration.mustache index 28082851c009..161affb1c9d8 100644 --- a/modules/swagger-codegen/src/main/resources/php/configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/php/configuration.mustache @@ -516,7 +516,7 @@ class Configuration $report = "PHP SDK ({{invokerPackage}}) Debug Report:\n"; $report .= " OS: ".php_uname()."\n"; $report .= " PHP Version: ".phpversion()."\n"; - $report .= " Swagger Spec Version: {{version}}\n"; + $report .= " OpenAPI Spec Version: {{version}}\n"; $report .= " SDK Package Version: {{artifactVersion}}\n"; $report .= " Temp Folder Path: ".self::getDefaultConfiguration()->getTempFolderPath()."\n"; diff --git a/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache b/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache index 837b1234fd0b..54854efe332f 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/api_client.mustache @@ -71,6 +71,7 @@ module {{moduleName}} :method => http_method, :headers => header_params, :params => query_params, + :timeout => @config.timeout, :ssl_verifypeer => @config.verify_ssl, :sslcert => @config.cert_file, :sslkey => @config.key_file, diff --git a/modules/swagger-codegen/src/main/resources/ruby/base_object.mustache b/modules/swagger-codegen/src/main/resources/ruby/base_object.mustache index ddb68998e9eb..d4ea5b334a62 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/base_object.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/base_object.mustache @@ -1,9 +1,3 @@ -require 'date' - -module {{moduleName}} - # base class containing fundamental method such as to_hash, build_from_hash and more - class BaseObject - # build the object from hash def build_from_hash(attributes) return nil unless attributes.is_a?(Hash) @@ -94,6 +88,3 @@ module {{moduleName}} value end end - - end -end diff --git a/modules/swagger-codegen/src/main/resources/ruby/configuration.mustache b/modules/swagger-codegen/src/main/resources/ruby/configuration.mustache index 4c05f2560fa1..160fa85a57d1 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/configuration.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/configuration.mustache @@ -60,6 +60,10 @@ module {{moduleName}} # @return [String] attr_accessor :temp_folder_path + # The time limit for HTTP request in seconds. + # Default to 0 (never times out). + attr_accessor :timeout + ### TLS/SSL # Set this to false to skip verifying SSL certificate when calling API from https server. # Default to true. @@ -93,6 +97,7 @@ module {{moduleName}} @base_path = '{{contextPath}}' @api_key = {} @api_key_prefix = {} + @timeout = 0 @verify_ssl = true @cert_file = nil @key_file = nil diff --git a/modules/swagger-codegen/src/main/resources/ruby/gem.mustache b/modules/swagger-codegen/src/main/resources/ruby/gem.mustache index 2000b2be86f1..ec5ee0ac17c3 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/gem.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/gem.mustache @@ -5,7 +5,6 @@ require '{{gemName}}/version' require '{{gemName}}/configuration' # Models -require '{{gemName}}/{{modelPackage}}/base_object' {{#models}} require '{{importPath}}' {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/ruby/model.mustache b/modules/swagger-codegen/src/main/resources/ruby/model.mustache index f253a2c0e60f..21de688e525c 100644 --- a/modules/swagger-codegen/src/main/resources/ruby/model.mustache +++ b/modules/swagger-codegen/src/main/resources/ruby/model.mustache @@ -1,6 +1,8 @@ +require 'date' + module {{moduleName}}{{#models}}{{#model}}{{#description}} # {{{description}}}{{/description}} - class {{classname}} < BaseObject{{#vars}}{{#description}} + class {{classname}}{{#vars}}{{#description}} # {{{description}}}{{/description}} attr_accessor :{{{name}}} {{/vars}} @@ -64,6 +66,8 @@ module {{moduleName}}{{#models}}{{#model}}{{#description}} def hash [{{#vars}}{{name}}{{#hasMore}}, {{/hasMore}}{{/vars}}].hash end + +{{> base_object}} end {{/model}} {{/models}} diff --git a/modules/swagger-codegen/src/main/resources/scalatra/README.mustache b/modules/swagger-codegen/src/main/resources/scalatra/README.mustache index 3ffa01fb2571..327870827fd6 100644 --- a/modules/swagger-codegen/src/main/resources/scalatra/README.mustache +++ b/modules/swagger-codegen/src/main/resources/scalatra/README.mustache @@ -2,7 +2,7 @@ ## Overview This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This is an example of building a swagger-enabled scalatra server. This example uses the [scalatra](http://scalatra.org/) framework. To see how to make this your own, look here: diff --git a/modules/swagger-codegen/src/main/resources/silex/README.mustache b/modules/swagger-codegen/src/main/resources/silex/README.mustache index 9f35636b3f86..d335e2f4ab88 100644 --- a/modules/swagger-codegen/src/main/resources/silex/README.mustache +++ b/modules/swagger-codegen/src/main/resources/silex/README.mustache @@ -2,7 +2,7 @@ ## Overview This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This is an example of building a PHP server. This example uses the [Silex](http://silex.sensiolabs.org/) micro-framework. To see how to make this your own, please take a look at the template here: diff --git a/modules/swagger-codegen/src/main/resources/slim/README.mustache b/modules/swagger-codegen/src/main/resources/slim/README.mustache index 3b19f46bd38f..03910060439a 100644 --- a/modules/swagger-codegen/src/main/resources/slim/README.mustache +++ b/modules/swagger-codegen/src/main/resources/slim/README.mustache @@ -2,7 +2,7 @@ ## Overview This server was generated by the [swagger-codegen](https://github.com/swagger-api/swagger-codegen) project. By using the -[swagger-spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This +[OpenAPI-Spec](https://github.com/swagger-api/swagger-core/wiki) from a remote server, you can easily generate a server stub. This is an example of building a PHP server. This example uses the [Slim Framework](http://www.slimframework.com/). To see how to make this your own, please take a look at the template here: diff --git a/modules/swagger-codegen/src/main/resources/swift/Cartfile.mustache b/modules/swagger-codegen/src/main/resources/swift/Cartfile.mustache index c27fd0c14d12..a0906ba59692 100644 --- a/modules/swagger-codegen/src/main/resources/swift/Cartfile.mustache +++ b/modules/swagger-codegen/src/main/resources/swift/Cartfile.mustache @@ -1,2 +1,2 @@ -github "Alamofire/Alamofire" >= 3.0.0{{#usePromiseKit}} +github "Alamofire/Alamofire" >= 3.1.0{{#usePromiseKit}} github "mxcl/PromiseKit" >=1.5.3{{/usePromiseKit}} diff --git a/modules/swagger-codegen/src/main/resources/swift/Extensions.mustache b/modules/swagger-codegen/src/main/resources/swift/Extensions.mustache index 0d367cb8be34..ed5786d3faa8 100644 --- a/modules/swagger-codegen/src/main/resources/swift/Extensions.mustache +++ b/modules/swagger-codegen/src/main/resources/swift/Extensions.mustache @@ -66,8 +66,8 @@ extension NSDate: JSONEncodable { {{#usePromiseKit}}extension RequestBuilder { public func execute() -> Promise> { - let deferred = Promise>.defer() - self.execute { (response: Response?, error: NSError?) in + let deferred = Promise>.pendingPromise() + self.execute { (response: Response?, error: ErrorType?) in if let response = response { deferred.fulfill(response) } else { diff --git a/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache b/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache index 5cf337ad6f2a..85b227ece87c 100644 --- a/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache +++ b/modules/swagger-codegen/src/main/resources/swift/Podspec.mustache @@ -15,6 +15,6 @@ Pod::Spec.new do |s| s.screenshots = {{& podScreenshots}}{{/podScreenshots}}{{#podDocumentationURL}} s.documentation_url = '{{podDocumentationURL}}'{{/podDocumentationURL}} s.source_files = '{{projectName}}/Classes/Swaggers/**/*.swift'{{#usePromiseKit}} - s.dependency 'PromiseKit', '~> 2.1'{{/usePromiseKit}} - s.dependency 'Alamofire', '~> 3.0.0' + s.dependency 'PromiseKit', '~> 3.0.0'{{/usePromiseKit}} + s.dependency 'Alamofire', '~> 3.1.4' end diff --git a/modules/swagger-codegen/src/main/resources/validator/index.mustache b/modules/swagger-codegen/src/main/resources/validator/index.mustache index 2f4c45b32dc0..0a1a54387749 100644 --- a/modules/swagger-codegen/src/main/resources/validator/index.mustache +++ b/modules/swagger-codegen/src/main/resources/validator/index.mustache @@ -2,7 +2,7 @@ - Swagger Spec Validator + OpenAPI Spec Validator