From d45be82bc2281d79792cd85d13ca03db19dc81c4 Mon Sep 17 00:00:00 2001 From: CH Albach Date: Mon, 24 Aug 2020 18:18:09 -0700 Subject: [PATCH 001/223] Fix Java codegen for multi-interface Serializable models --- src/main/resources/handlebars/Java/pojo.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/handlebars/Java/pojo.mustache b/src/main/resources/handlebars/Java/pojo.mustache index 9ea3ba87e5..f5ae6332c6 100644 --- a/src/main/resources/handlebars/Java/pojo.mustache +++ b/src/main/resources/handlebars/Java/pojo.mustache @@ -7,7 +7,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) {{/notNullJacksonAnnotation}} -public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#parcelableModel}}implements Parcelable {{#serializableModel}}, Serializable {{/serializableModel}}{{#interfaceModels}}{{#@first}}, {{/@first}}{{classname}}{{^@last}}, {{/@last}}{{#@last}} {{/@last}}{{/interfaceModels}}{{/parcelableModel}}{{^parcelableModel}}{{#serializableModel}}implements Serializable{{#interfaceModels}}, {{classname}}{{^@last}}, {{/@last}}{{#@last}} {{/@last}}{{/interfaceModels}}{{/serializableModel}}{{^serializableModel}}{{#interfaceModels}}{{#@first}}implements {{/@first}}{{classname}}{{^@last}}, {{/@last}}{{#@last}} {{/@last}}{{/interfaceModels}}{{/serializableModel}}{{/parcelableModel}}{ +public class {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{{#parcelableModel}}implements Parcelable {{#serializableModel}}, Serializable {{/serializableModel}}{{#interfaceModels}}{{#@first}}, {{/@first}}{{classname}}{{^@last}}, {{/@last}}{{#@last}} {{/@last}}{{/interfaceModels}}{{/parcelableModel}}{{^parcelableModel}}{{#serializableModel}}implements Serializable{{#interfaceModels}}{{#@first}}, {{/@first}}{{classname}}{{^@last}}, {{/@last}}{{#@last}} {{/@last}}{{/interfaceModels}}{{/serializableModel}}{{^serializableModel}}{{#interfaceModels}}{{#@first}}implements {{/@first}}{{classname}}{{^@last}}, {{/@last}}{{#@last}} {{/@last}}{{/interfaceModels}}{{/serializableModel}}{{/parcelableModel}}{ {{#serializableModel}} private static final long serialVersionUID = 1L; {{/serializableModel}} From 8bd985c57383a040106a54a07b639e928743e064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?He=CC=81lder=20Diniz?= Date: Mon, 16 Nov 2020 17:03:45 +0000 Subject: [PATCH 002/223] #804 Java generated code does not implement discriminator mappings correctly --- .../Java/typeInfoAnnotation.mustache | 19 +++++++++++++------ .../JavaInflector/typeInfoAnnotation.mustache | 19 +++++++++++++------ .../JavaJaxRS/typeInfoAnnotation.mustache | 19 +++++++++++++------ .../JavaMicronaut/typeInfoAnnotation.mustache | 19 +++++++++++++------ 4 files changed, 52 insertions(+), 24 deletions(-) diff --git a/src/main/resources/handlebars/Java/typeInfoAnnotation.mustache b/src/main/resources/handlebars/Java/typeInfoAnnotation.mustache index f2a2e1c88f..52695c64fe 100644 --- a/src/main/resources/handlebars/Java/typeInfoAnnotation.mustache +++ b/src/main/resources/handlebars/Java/typeInfoAnnotation.mustache @@ -1,7 +1,14 @@ {{#jackson}} -@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{discriminator.propertyName}}", visible = true ) -@JsonSubTypes({ - {{#children}} - @JsonSubTypes.Type(value = {{classname}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"), - {{/children}} -}){{/jackson}} + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{discriminator.propertyName}}", visible = true ) + @JsonSubTypes({ + {{#if discriminator.mapping}} + {{#each discriminator.mapping}} + @JsonSubTypes.Type(value = {{this}}.class, name = "{{@key}}"), + {{/each}} + {{else}} + {{#children}} + @JsonSubTypes.Type(value = {{classname}}.class, name = "{{name}}"), + {{/children}} + {{/if}} + }) +{{/jackson}} diff --git a/src/main/resources/handlebars/JavaInflector/typeInfoAnnotation.mustache b/src/main/resources/handlebars/JavaInflector/typeInfoAnnotation.mustache index f2a2e1c88f..52695c64fe 100644 --- a/src/main/resources/handlebars/JavaInflector/typeInfoAnnotation.mustache +++ b/src/main/resources/handlebars/JavaInflector/typeInfoAnnotation.mustache @@ -1,7 +1,14 @@ {{#jackson}} -@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{discriminator.propertyName}}", visible = true ) -@JsonSubTypes({ - {{#children}} - @JsonSubTypes.Type(value = {{classname}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"), - {{/children}} -}){{/jackson}} + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{discriminator.propertyName}}", visible = true ) + @JsonSubTypes({ + {{#if discriminator.mapping}} + {{#each discriminator.mapping}} + @JsonSubTypes.Type(value = {{this}}.class, name = "{{@key}}"), + {{/each}} + {{else}} + {{#children}} + @JsonSubTypes.Type(value = {{classname}}.class, name = "{{name}}"), + {{/children}} + {{/if}} + }) +{{/jackson}} diff --git a/src/main/resources/handlebars/JavaJaxRS/typeInfoAnnotation.mustache b/src/main/resources/handlebars/JavaJaxRS/typeInfoAnnotation.mustache index f2a2e1c88f..52695c64fe 100644 --- a/src/main/resources/handlebars/JavaJaxRS/typeInfoAnnotation.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/typeInfoAnnotation.mustache @@ -1,7 +1,14 @@ {{#jackson}} -@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{discriminator.propertyName}}", visible = true ) -@JsonSubTypes({ - {{#children}} - @JsonSubTypes.Type(value = {{classname}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"), - {{/children}} -}){{/jackson}} + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{discriminator.propertyName}}", visible = true ) + @JsonSubTypes({ + {{#if discriminator.mapping}} + {{#each discriminator.mapping}} + @JsonSubTypes.Type(value = {{this}}.class, name = "{{@key}}"), + {{/each}} + {{else}} + {{#children}} + @JsonSubTypes.Type(value = {{classname}}.class, name = "{{name}}"), + {{/children}} + {{/if}} + }) +{{/jackson}} diff --git a/src/main/resources/handlebars/JavaMicronaut/typeInfoAnnotation.mustache b/src/main/resources/handlebars/JavaMicronaut/typeInfoAnnotation.mustache index 9fbced41d8..52695c64fe 100644 --- a/src/main/resources/handlebars/JavaMicronaut/typeInfoAnnotation.mustache +++ b/src/main/resources/handlebars/JavaMicronaut/typeInfoAnnotation.mustache @@ -1,7 +1,14 @@ {{#jackson}} -@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{discriminator.propertyName}}", visible = true ) -@JsonSubTypes({ - {{#children}} - @JsonSubTypes.Type(value = {{classname}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"), - {{/children}} -}){{/jackson}} \ No newline at end of file + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{discriminator.propertyName}}", visible = true ) + @JsonSubTypes({ + {{#if discriminator.mapping}} + {{#each discriminator.mapping}} + @JsonSubTypes.Type(value = {{this}}.class, name = "{{@key}}"), + {{/each}} + {{else}} + {{#children}} + @JsonSubTypes.Type(value = {{classname}}.class, name = "{{name}}"), + {{/children}} + {{/if}} + }) +{{/jackson}} From a06495fee8bd482e9bf8e9295578bba3b1377537 Mon Sep 17 00:00:00 2001 From: "whitesource-for-github-com[bot]" <50673670+whitesource-for-github-com[bot]@users.noreply.github.com> Date: Fri, 4 Dec 2020 18:56:24 +0000 Subject: [PATCH 003/223] Add .whitesource configuration file --- .whitesource | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .whitesource diff --git a/.whitesource b/.whitesource new file mode 100644 index 0000000000..db4b0fec82 --- /dev/null +++ b/.whitesource @@ -0,0 +1,15 @@ +{ + "scanSettings": { + "configMode": "AUTO", + "configExternalURL": "", + "projectToken": "", + "baseBranches": [] + }, + "checkRunSettings": { + "vulnerableCheckRunConclusionLevel": "failure", + "displayMode": "diff" + }, + "issueSettings": { + "minSeverityLevel": "LOW" + } +} \ No newline at end of file From 1c00e7ae5d6469063de5bd39f82b15f5cef59782 Mon Sep 17 00:00:00 2001 From: tc-imba Date: Tue, 8 Jun 2021 03:59:20 +0800 Subject: [PATCH 004/223] fix python namespace package folders --- .../generators/python/PythonClientCodegen.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/python/PythonClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/python/PythonClientCodegen.java index 08c4541a36..b11e964150 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/python/PythonClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/python/PythonClientCodegen.java @@ -201,16 +201,18 @@ public void processOpts() { setPackageUrl((String) additionalProperties.get(PACKAGE_URL)); } + final String packageFolder = packageName.replace('.', File.separatorChar); + supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); supportingFiles.add(new SupportingFile("tox.mustache", "", "tox.ini")); supportingFiles.add(new SupportingFile("test-requirements.mustache", "", "test-requirements.txt")); supportingFiles.add(new SupportingFile("requirements.mustache", "", "requirements.txt")); - supportingFiles.add(new SupportingFile("configuration.mustache", packageName, "configuration.py")); - supportingFiles.add(new SupportingFile("__init__package.mustache", packageName, "__init__.py")); - supportingFiles.add(new SupportingFile("__init__model.mustache", packageName + File.separatorChar + modelPackage, "__init__.py")); - supportingFiles.add(new SupportingFile("__init__api.mustache", packageName + File.separatorChar + apiPackage, "__init__.py")); + supportingFiles.add(new SupportingFile("configuration.mustache", packageFolder, "configuration.py")); + supportingFiles.add(new SupportingFile("__init__package.mustache", packageFolder, "__init__.py")); + supportingFiles.add(new SupportingFile("__init__model.mustache", packageFolder + File.separatorChar + modelPackage, "__init__.py")); + supportingFiles.add(new SupportingFile("__init__api.mustache", packageFolder + File.separatorChar + apiPackage, "__init__.py")); if(Boolean.FALSE.equals(excludeTests)) { supportingFiles.add(new SupportingFile("__init__test.mustache", testFolder, "__init__.py")); @@ -219,16 +221,16 @@ public void processOpts() { supportingFiles.add(new SupportingFile("gitignore.mustache", "", ".gitignore")); supportingFiles.add(new SupportingFile("travis.mustache", "", ".travis.yml")); supportingFiles.add(new SupportingFile("setup.mustache", "", "setup.py")); - supportingFiles.add(new SupportingFile("api_client.mustache", packageName, "api_client.py")); + supportingFiles.add(new SupportingFile("api_client.mustache", packageFolder, "api_client.py")); if ("asyncio".equals(getLibrary())) { - supportingFiles.add(new SupportingFile("asyncio/rest.mustache", packageName, "rest.py")); + supportingFiles.add(new SupportingFile("asyncio/rest.mustache", packageFolder, "rest.py")); additionalProperties.put("asyncio", "true"); } else if ("tornado".equals(getLibrary())) { - supportingFiles.add(new SupportingFile("tornado/rest.mustache", packageName, "rest.py")); + supportingFiles.add(new SupportingFile("tornado/rest.mustache", packageFolder, "rest.py")); additionalProperties.put("tornado", "true"); } else { - supportingFiles.add(new SupportingFile("rest.mustache", packageName, "rest.py")); + supportingFiles.add(new SupportingFile("rest.mustache", packageFolder, "rest.py")); } modelPackage = packageName + "." + modelPackage; From 7385c63c50baabadb5c3d2a0ee6ab977a6b7d6da Mon Sep 17 00:00:00 2001 From: 7006 <22399553+7006@users.noreply.github.com> Date: Thu, 10 Jun 2021 17:30:03 +0300 Subject: [PATCH 005/223] Update package.mustache update to the latest version of axios to fix high vulnerability reported by npm audit. More info https://npmjs.com/advisories/1594 --- src/main/resources/handlebars/typescript-axios/package.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/handlebars/typescript-axios/package.mustache b/src/main/resources/handlebars/typescript-axios/package.mustache index da07d370fa..6c6114ebcf 100644 --- a/src/main/resources/handlebars/typescript-axios/package.mustache +++ b/src/main/resources/handlebars/typescript-axios/package.mustache @@ -18,7 +18,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "axios": "^0.19.2" + "axios": "^0.21.1" }, "devDependencies": { "@types/node": "^12.11.5", From 6e128472b896e6eeb079efb7775f8ec5e8b1b04a Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Wed, 28 Jul 2021 00:04:54 -0500 Subject: [PATCH 006/223] fixed missed properties --- .../v3/generators/DefaultCodegenConfig.java | 16 +++++---- .../v3/generators/php/PhpClientCodegen.java | 34 +++++++++++++------ 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java index 3273c05a07..326fb5d306 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java +++ b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java @@ -1358,12 +1358,7 @@ public CodegenModel fromModel(String name, Schema schema, Map al addParentContainer(codegenModel, name, schema); } else if (schema instanceof MapSchema) { - codegenModel.getVendorExtensions().put(CodegenConstants.IS_MAP_CONTAINER_EXT_NAME, Boolean.TRUE); - codegenModel.getVendorExtensions().put(IS_CONTAINER_EXT_NAME, Boolean.TRUE); - addParentContainer(codegenModel, name, schema); - if (hasSchemaProperties(schema) || hasTrueAdditionalProperties(schema)) { - addAdditionPropertiesToCodeGenModel(codegenModel, schema); - } + processMapSchema(codegenModel, name, schema); } else if (schema instanceof ComposedSchema) { @@ -1493,6 +1488,15 @@ else if (schema instanceof ComposedSchema) { return codegenModel; } + protected void processMapSchema(CodegenModel codegenModel, String name, Schema schema) { + codegenModel.getVendorExtensions().put(CodegenConstants.IS_MAP_CONTAINER_EXT_NAME, Boolean.TRUE); + codegenModel.getVendorExtensions().put(IS_CONTAINER_EXT_NAME, Boolean.TRUE); + addParentContainer(codegenModel, name, schema); + if (hasSchemaProperties(schema) || hasTrueAdditionalProperties(schema)) { + addAdditionPropertiesToCodeGenModel(codegenModel, schema); + } + } + /** * Recursively look for a discriminator in the interface tree */ diff --git a/src/main/java/io/swagger/codegen/v3/generators/php/PhpClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/php/PhpClientCodegen.java index 682e6cb869..b0cb199fa3 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/php/PhpClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/php/PhpClientCodegen.java @@ -2,6 +2,7 @@ import io.swagger.codegen.v3.CliOption; import io.swagger.codegen.v3.CodegenConstants; +import io.swagger.codegen.v3.CodegenModel; import io.swagger.codegen.v3.CodegenOperation; import io.swagger.codegen.v3.CodegenParameter; import io.swagger.codegen.v3.CodegenProperty; @@ -9,25 +10,32 @@ import io.swagger.codegen.v3.CodegenType; import io.swagger.codegen.v3.SupportingFile; import io.swagger.codegen.v3.generators.DefaultCodegenConfig; +import io.swagger.v3.oas.models.media.ArraySchema; +import io.swagger.v3.oas.models.media.BooleanSchema; +import io.swagger.v3.oas.models.media.DateSchema; +import io.swagger.v3.oas.models.media.DateTimeSchema; +import io.swagger.v3.oas.models.media.IntegerSchema; +import io.swagger.v3.oas.models.media.MapSchema; +import io.swagger.v3.oas.models.media.NumberSchema; +import io.swagger.v3.oas.models.media.ObjectSchema; +import io.swagger.v3.oas.models.media.Schema; +import io.swagger.v3.oas.models.media.StringSchema; +import io.swagger.v3.oas.models.security.SecurityScheme; +import io.swagger.v3.parser.util.SchemaTypeUtil; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.File; -import java.util.Arrays; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.HashSet; import java.util.regex.Matcher; -import io.swagger.v3.oas.models.media.*; -import io.swagger.v3.oas.models.security.SecurityScheme; -import io.swagger.v3.parser.util.SchemaTypeUtil; -import org.apache.commons.lang3.StringUtils; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import static io.swagger.codegen.v3.generators.handlebars.ExtensionHelper.getBooleanValue; public class PhpClientCodegen extends DefaultCodegenConfig { @@ -444,6 +452,12 @@ public void setComposerProjectName(String composerProjectName) { this.composerProjectName = composerProjectName; } + @Override + protected void processMapSchema(CodegenModel codegenModel, String name, Schema schema) { + super.processMapSchema(codegenModel, name, schema); + addVars(codegenModel, schema.getProperties(), schema.getRequired()); + } + @Override public String toVarName(String name) { // sanitize name From 117cd280d6370dc0a92d53a71fdba4619d413d86 Mon Sep 17 00:00:00 2001 From: Ben Kelley Date: Tue, 10 Aug 2021 10:36:44 +1000 Subject: [PATCH 007/223] Fix #936 where property names differ, but getter/setter names match. --- .../generators/java/AbstractJavaCodegen.java | 9 +- .../java/AbstractJavaCodegenTest.java | 126 ++++++++++++++++++ 2 files changed, 134 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java index e1104ff59c..55e10d3c9e 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java @@ -33,6 +33,7 @@ import java.io.File; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -41,7 +42,9 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static io.swagger.codegen.v3.CodegenConstants.HAS_ENUMS_EXT_NAME; import static io.swagger.codegen.v3.CodegenConstants.IS_ENUM_EXT_NAME; @@ -1022,7 +1025,11 @@ protected void fixUpParentAndInterfaces(CodegenModel codegenModel, Map parentProperty.name.equals(codegenProperty.name) && !parentProperty.datatype.equals(codegenProperty.datatype)); + .anyMatch(parentProperty -> + (parentProperty.name.equals(codegenProperty.name) || + parentProperty.getGetter().equals(codegenProperty.getGetter()) || + parentProperty.getSetter().equals(codegenProperty.getSetter()) && + !parentProperty.datatype.equals(codegenProperty.datatype))); if (hasConflict) { codegenProperty.name = toVarName(codegenModel.name + "_" + codegenProperty.name); codegenProperty.getter = toGetter(codegenProperty.name); diff --git a/src/test/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegenTest.java b/src/test/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegenTest.java index 1b2eaf5731..646a42d5b2 100644 --- a/src/test/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegenTest.java +++ b/src/test/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegenTest.java @@ -2,6 +2,8 @@ import io.swagger.codegen.v3.CodegenArgument; import io.swagger.codegen.v3.CodegenConstants; +import io.swagger.codegen.v3.CodegenModel; +import io.swagger.codegen.v3.CodegenProperty; import io.swagger.codegen.v3.CodegenType; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; @@ -10,7 +12,11 @@ import org.testng.Assert; import org.testng.annotations.Test; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class AbstractJavaCodegenTest { @@ -163,6 +169,126 @@ public void testPackageNamesSetWithAdditionalProperties() throws Exception { Assert.assertEquals(codegen.additionalProperties().get(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG), Boolean.TRUE); } + @Test + public void testFixUpParentAndInterfaces_propertyNameDifferent_getterSetterSame_typeDifferent() { + AbstractJavaCodegen codegen = new P_AbstractJavaCodegen(); + + CodegenModel parentModel = new CodegenModel(); + parentModel.name = "parent_type"; + CodegenModel childModel = new CodegenModel(); + childModel.name = "child_type"; + childModel.parentModel = parentModel; + parentModel.children = new ArrayList<>(); + + CodegenProperty parentValueProperty1 = new CodegenProperty(); + parentValueProperty1.name = "value"; + parentValueProperty1.baseName = "value"; + parentValueProperty1.getter = "getValue"; + parentValueProperty1.setter = "setValue"; + parentValueProperty1.datatype = "value_type"; + CodegenProperty parentValueProperty2 = new CodegenProperty(); + parentValueProperty2.name = "other_value"; + parentValueProperty2.baseName = "other_value"; + parentValueProperty2.getter = "getOtherValue"; + parentValueProperty2.setter = "setOtherValue"; + parentValueProperty2.datatype = "other_type"; + parentModel.vars = new ArrayList<>(); + parentModel.vars.add(parentValueProperty1); + parentModel.vars.add(parentValueProperty2); + + CodegenProperty childValueProperty1 = new CodegenProperty(); + childValueProperty1.name = "_value"; // different to parent "value" + childValueProperty1.baseName = "_value"; + childValueProperty1.getter = "getValue"; // same as parent "getValue" + childValueProperty1.setter = "setValue"; // same as parent "setValue" + childValueProperty1.datatype = "different_type"; // different to parent "value_type" + CodegenProperty childValueProperty2 = new CodegenProperty(); + childValueProperty2.name = "third_value"; + childValueProperty2.baseName = "third_value"; + childValueProperty2.getter = "getThirdValue"; + childValueProperty2.setter = "setThirdValue"; + childValueProperty2.datatype = "other_type"; + childModel.vars = new ArrayList<>(); + childModel.vars.add(childValueProperty1); + childModel.vars.add(childValueProperty2); + + Map allModels = new HashMap<>(); + allModels.put(parentModel.name, parentModel); + allModels.put(childModel.name, childModel); + + codegen.fixUpParentAndInterfaces(childModel, Collections.EMPTY_MAP); + Assert.assertEquals(childModel.vars.get(0).baseName, "_value"); + Assert.assertEquals(childModel.vars.get(0).name, "childTypeValue"); + Assert.assertEquals(childModel.vars.get(0).getter, "getChildTypeValue"); + Assert.assertEquals(childModel.vars.get(0).setter, "setChildTypeValue"); + + // unchanged + Assert.assertEquals(childModel.vars.get(1).baseName, childValueProperty2.baseName); + Assert.assertEquals(childModel.vars.get(1).name, childValueProperty2.name); + Assert.assertEquals(childModel.vars.get(1).getter, childValueProperty2.getter); + Assert.assertEquals(childModel.vars.get(1).setter, childValueProperty2.setter); + } + + @Test + public void testFixUpParentAndInterfaces_propertyNameSame_getterSetterSame_typeDifferent() { + AbstractJavaCodegen codegen = new P_AbstractJavaCodegen(); + + CodegenModel parentModel = new CodegenModel(); + parentModel.name = "parent_type"; + CodegenModel childModel = new CodegenModel(); + childModel.name = "child_type"; + childModel.parentModel = parentModel; + parentModel.children = new ArrayList<>(); + + CodegenProperty parentValueProperty1 = new CodegenProperty(); + parentValueProperty1.name = "value"; + parentValueProperty1.baseName = "value"; + parentValueProperty1.getter = "getValue"; + parentValueProperty1.setter = "setValue"; + parentValueProperty1.datatype = "value_type"; + CodegenProperty parentValueProperty2 = new CodegenProperty(); + parentValueProperty2.name = "other_value"; + parentValueProperty2.baseName = "other_value"; + parentValueProperty2.getter = "getOtherValue"; + parentValueProperty2.setter = "setOtherValue"; + parentValueProperty2.datatype = "other_type"; + parentModel.vars = new ArrayList<>(); + parentModel.vars.add(parentValueProperty1); + parentModel.vars.add(parentValueProperty2); + + CodegenProperty childValueProperty1 = new CodegenProperty(); + childValueProperty1.name = "value"; // same as parent "value" + childValueProperty1.baseName = "value"; + childValueProperty1.getter = "getValue"; // same as parent "getValue" + childValueProperty1.setter = "setValue"; // same as parent "setValue" + childValueProperty1.datatype = "different_type"; // different to parent "value_type" + CodegenProperty childValueProperty2 = new CodegenProperty(); + childValueProperty2.name = "third_value"; + childValueProperty2.baseName = "third_value"; + childValueProperty2.getter = "getThirdValue"; + childValueProperty2.setter = "setThirdValue"; + childValueProperty2.datatype = "other_type"; + childModel.vars = new ArrayList<>(); + childModel.vars.add(childValueProperty1); + childModel.vars.add(childValueProperty2); + + Map allModels = new HashMap<>(); + allModels.put(parentModel.name, parentModel); + allModels.put(childModel.name, childModel); + + codegen.fixUpParentAndInterfaces(childModel, Collections.EMPTY_MAP); + Assert.assertEquals(childModel.vars.get(0).baseName, "value"); + Assert.assertEquals(childModel.vars.get(0).name, "childTypeValue"); + Assert.assertEquals(childModel.vars.get(0).getter, "getChildTypeValue"); + Assert.assertEquals(childModel.vars.get(0).setter, "setChildTypeValue"); + + // unchanged + Assert.assertEquals(childModel.vars.get(1).baseName, childValueProperty2.baseName); + Assert.assertEquals(childModel.vars.get(1).name, childValueProperty2.name); + Assert.assertEquals(childModel.vars.get(1).getter, childValueProperty2.getter); + Assert.assertEquals(childModel.vars.get(1).setter, childValueProperty2.setter); + } + public static class P_AbstractJavaCodegen extends AbstractJavaCodegen { @Override public String getArgumentsLocation() { From d8a23f32f379e7890733e5e9933a7fc59656264d Mon Sep 17 00:00:00 2001 From: Ben Kelley Date: Tue, 10 Aug 2021 10:37:29 +1000 Subject: [PATCH 008/223] Fix #939 where setter was getting named the same as the getter --- .../swagger/codegen/v3/generators/java/AbstractJavaCodegen.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java index 55e10d3c9e..86dd930f8b 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java @@ -1033,7 +1033,7 @@ protected void fixUpParentAndInterfaces(CodegenModel codegenModel, Map Date: Tue, 10 Aug 2021 10:40:37 +1000 Subject: [PATCH 009/223] Remove unused imports. --- .../codegen/v3/generators/java/AbstractJavaCodegen.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java index 86dd930f8b..6b02a27fbd 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java @@ -33,7 +33,6 @@ import java.io.File; import java.util.Arrays; -import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -42,9 +41,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.Set; import java.util.regex.Pattern; -import java.util.stream.Collectors; import static io.swagger.codegen.v3.CodegenConstants.HAS_ENUMS_EXT_NAME; import static io.swagger.codegen.v3.CodegenConstants.IS_ENUM_EXT_NAME; From 6e7f175faaeb3bcc047372cd489eb65154d180ad Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Sun, 15 Aug 2021 14:23:38 -0500 Subject: [PATCH 010/223] added java 11 support to java generators --- .../generators/java/AbstractJavaCodegen.java | 17 +++++++---- .../v3/generators/java/SpringCodegen.java | 18 +++++++++-- .../Java/libraries/feign/auth/OAuth.mustache | 6 ++-- .../Java/libraries/feign/pom.mustache | 22 ++++++++++++-- .../Java/libraries/okhttp-gson/pom.mustache | 18 ++++++++++- .../Java/libraries/resttemplate/pom.mustache | 16 ++++++++++ .../Java/libraries/retrofit/pom.mustache | 16 ++++++++++ .../Java/libraries/retrofit2/pom.mustache | 18 ++++++++++- .../resources/handlebars/Java/pom.mustache | 16 ++++++++++ .../handlebars/JavaInflector/pom.mustache | 4 +++ .../handlebars/JavaJaxRS/cxf-cdi/pom.mustache | 7 +++++ .../handlebars/JavaJaxRS/cxf/pom.mustache | 2 +- .../JavaJaxRS/cxf/server/pom.mustache | 2 +- .../JavaJaxRS/libraries/jersey1/pom.mustache | 2 +- .../handlebars/JavaJaxRS/pom.mustache | 2 +- .../JavaJaxRS/resteasy/eap/pom.mustache | 4 +-- .../JavaJaxRS/resteasy/pom.mustache | 4 +-- .../handlebars/JavaJaxRS/spec/pom.mustache | 22 ++++++++++++++ .../handlebars/JavaSpring/api.mustache | 6 ++-- .../JavaSpring/apiController.mustache | 12 ++++---- .../JavaSpring/apiDelegate.mustache | 30 +++++++++---------- .../libraries/spring-boot/pom.mustache | 20 ++++++++++++- .../libraries/spring-cloud/pom.mustache | 2 +- .../libraries/spring-mvc/pom.mustache | 20 ++++++++++++- 24 files changed, 234 insertions(+), 52 deletions(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java index 6b02a27fbd..e5452c30ec 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java @@ -54,6 +54,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegenConfig { public static final String DEFAULT_LIBRARY = ""; public static final String DATE_LIBRARY = "dateLibrary"; public static final String JAVA8_MODE = "java8"; + public static final String JAVA11_MODE = "java11"; public static final String WITH_XML = "withXml"; public static final String SUPPORT_JAVA6 = "supportJava6"; public static final String ERROR_ON_UNKNOWN_ENUM = "errorOnUnknownEnum"; @@ -61,6 +62,7 @@ public abstract class AbstractJavaCodegen extends DefaultCodegenConfig { protected String dateLibrary = "threetenbp"; protected boolean java8Mode = false; + protected boolean java11Mode = false; protected boolean withXml = false; protected String invokerPackage = "io.swagger"; protected String groupId = "io.swagger"; @@ -165,6 +167,7 @@ public AbstractJavaCodegen() { CliOption dateLibrary = new CliOption(DATE_LIBRARY, "Option. Date library to use"); Map dateOptions = new HashMap(); dateOptions.put("java8", "Java 8 native JSR310 (preferred for jdk 1.8+) - note: this also sets \"" + JAVA8_MODE + "\" to true"); + dateOptions.put("java11", "Java 11 native JSR384 (preferred for jdk 11+) - note: this also sets \"" + JAVA11_MODE + "\" to true"); dateOptions.put("threetenbp", "Backport of JSR310 (preferred for jdk < 1.8)"); dateOptions.put("java8-localdatetime", "Java 8 using LocalDateTime (for legacy app only)"); dateOptions.put("joda", "Joda (for legacy app only)"); @@ -424,12 +427,10 @@ public void processOpts() { // used later in recursive import in postProcessingModels importMapping.put("com.fasterxml.jackson.annotation.JsonProperty", "com.fasterxml.jackson.annotation.JsonCreator"); - if(additionalProperties.containsKey(JAVA8_MODE)) { - setJava8Mode(Boolean.parseBoolean(additionalProperties.get(JAVA8_MODE).toString())); - if ( java8Mode ) { - additionalProperties.put("java8", true); - } - } + setJava8Mode(Boolean.parseBoolean(String.valueOf(additionalProperties.get(JAVA8_MODE)))); + additionalProperties.put(JAVA8_MODE, java8Mode); + setJava11Mode(Boolean.parseBoolean(String.valueOf(additionalProperties.get(JAVA11_MODE)))); + additionalProperties.put(JAVA11_MODE, java11Mode); if(additionalProperties.containsKey(WITH_XML)) { setWithXml(Boolean.parseBoolean(additionalProperties.get(WITH_XML).toString())); @@ -1538,6 +1539,10 @@ public void setJava8Mode(boolean enabled) { this.java8Mode = enabled; } + public void setJava11Mode(boolean java11Mode) { + this.java11Mode = java11Mode; + } + @Override public String escapeQuotationMark(String input) { // remove " to avoid code injection diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java index c77711db1a..46e1b0327b 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java @@ -68,6 +68,7 @@ public class SpringCodegen extends AbstractJavaCodegen implements BeanValidation protected boolean delegateMethod = false; protected boolean singleContentTypes = false; protected boolean java8 = false; + protected boolean java11 = false; protected boolean async = false; protected String responseWrapper = ""; protected boolean useTags = false; @@ -181,10 +182,19 @@ public void processOpts() { if (!additionalProperties.containsKey(DATE_LIBRARY)) { setDateLibrary("java8"); } - } else { - this.defaultInterfaces = false; } + if (additionalProperties.containsKey(JAVA11_MODE)) { + this.setJava11(Boolean.valueOf(additionalProperties.get(JAVA11_MODE).toString())); + } + if (this.java11) { + additionalProperties.put("javaVersion", "11"); + additionalProperties.put("jdk11", "true"); + } + + additionalProperties.put("isJava8or11", this.java8 || this.java11); + this.defaultInterfaces = !(this.java8 || this.java11); + // set invokerPackage as basePackage if (additionalProperties.containsKey(CodegenConstants.INVOKER_PACKAGE)) { this.setBasePackage((String) additionalProperties.get(CodegenConstants.INVOKER_PACKAGE)); @@ -383,7 +393,7 @@ public void processOpts() { } } - if ((!this.delegatePattern && this.java8) || this.delegateMethod) { + if ((!this.delegatePattern && (this.java8 || this.java11)) || this.delegateMethod) { additionalProperties.put("jdk8-no-delegate", true); } @@ -800,6 +810,8 @@ public void setSingleContentTypes(boolean singleContentTypes) { public void setJava8(boolean java8) { this.java8 = java8; } + public void setJava11(boolean java11) { this.java11 = java11; } + public void setAsync(boolean async) { this.async = async; } public void setResponseWrapper(String responseWrapper) { this.responseWrapper = responseWrapper; } diff --git a/src/main/resources/handlebars/Java/libraries/feign/auth/OAuth.mustache b/src/main/resources/handlebars/Java/libraries/feign/auth/OAuth.mustache index 6be36b5b91..ede95edce7 100644 --- a/src/main/resources/handlebars/Java/libraries/feign/auth/OAuth.mustache +++ b/src/main/resources/handlebars/Java/libraries/feign/auth/OAuth.mustache @@ -87,19 +87,19 @@ public class OAuth implements RequestInterceptor { } // If first time, get the token if (expirationTimeMillis == null || System.currentTimeMillis() >= expirationTimeMillis) { - updateAccessToken(); + updateAccessToken(template); } if (getAccessToken() != null) { template.header("Authorization", "Bearer " + getAccessToken()); } } - public synchronized void updateAccessToken() { + public synchronized void updateAccessToken(RequestTemplate template) { OAuthJSONAccessTokenResponse accessTokenResponse; try { accessTokenResponse = oauthClient.accessToken(tokenRequestBuilder.buildBodyMessage()); } catch (Exception e) { - throw new RetryableException(e.getMessage(), e,null); + throw new RetryableException(400, e.getMessage(), template.request().httpMethod(), e, null, template.request()); } if (accessTokenResponse != null && accessTokenResponse.getAccessToken() != null) { setAccessToken(accessTokenResponse.getAccessToken(), accessTokenResponse.getExpiresIn()); diff --git a/src/main/resources/handlebars/Java/libraries/feign/pom.mustache b/src/main/resources/handlebars/Java/libraries/feign/pom.mustache index b6d531a652..ce23b76f21 100644 --- a/src/main/resources/handlebars/Java/libraries/feign/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/feign/pom.mustache @@ -165,6 +165,22 @@ + {{#java11}} + + jdk11 + + [11,) + + + + com.sun.xml.ws + jaxws-rt + 2.3.3 + pom + + + + {{/java11}} @@ -279,7 +295,7 @@ - {{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}} + {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} ${java.version} ${java.version} {{#useOas2}} @@ -288,8 +304,8 @@ {{^useOas2}} 2.0.0 {{/useOas2}} - 9.4.0 - 2.1.0 + 11.6 + 3.8.0 2.10.1 {{#threetenbp}} 2.6.4 diff --git a/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache b/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache index d9a8887cdf..356b0d76c2 100644 --- a/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache @@ -166,6 +166,22 @@ + {{#java11}} + + jdk11 + + [11,) + + + + com.sun.xml.ws + jaxws-rt + 2.3.3 + pom + + + + {{/java11}} @@ -276,7 +292,7 @@ - {{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}} + {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} ${java.version} ${java.version} {{#useOas2}} diff --git a/src/main/resources/handlebars/Java/libraries/resttemplate/pom.mustache b/src/main/resources/handlebars/Java/libraries/resttemplate/pom.mustache index e032df8d00..df731f2dbd 100644 --- a/src/main/resources/handlebars/Java/libraries/resttemplate/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/resttemplate/pom.mustache @@ -181,6 +181,22 @@ + {{#java11}} + + jdk11 + + [11,) + + + + com.sun.xml.ws + jaxws-rt + 2.3.3 + pom + + + + {{/java11}} diff --git a/src/main/resources/handlebars/Java/libraries/retrofit/pom.mustache b/src/main/resources/handlebars/Java/libraries/retrofit/pom.mustache index cbeada35bd..dadf9a22c5 100644 --- a/src/main/resources/handlebars/Java/libraries/retrofit/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/retrofit/pom.mustache @@ -174,6 +174,22 @@ + {{#java11}} + + jdk11 + + [11,) + + + + com.sun.xml.ws + jaxws-rt + 2.3.3 + pom + + + + {{/java11}} diff --git a/src/main/resources/handlebars/Java/libraries/retrofit2/pom.mustache b/src/main/resources/handlebars/Java/libraries/retrofit2/pom.mustache index a9da7810fe..fc60a4f0f0 100644 --- a/src/main/resources/handlebars/Java/libraries/retrofit2/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/retrofit2/pom.mustache @@ -166,6 +166,22 @@ + {{#java11}} + + jdk11 + + [11,) + + + + com.sun.xml.ws + jaxws-rt + 2.3.3 + pom + + + + {{/java11}} @@ -323,7 +339,7 @@ UTF-8 - {{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}} + {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} ${java.version} ${java.version} 1.8.0 diff --git a/src/main/resources/handlebars/Java/pom.mustache b/src/main/resources/handlebars/Java/pom.mustache index 805fe40a9e..abc6c554d2 100644 --- a/src/main/resources/handlebars/Java/pom.mustache +++ b/src/main/resources/handlebars/Java/pom.mustache @@ -181,6 +181,22 @@ + {{#java11}} + + jdk11 + + [11,) + + + + com.sun.xml.ws + jaxws-rt + 2.3.3 + pom + + + + {{/java11}} diff --git a/src/main/resources/handlebars/JavaInflector/pom.mustache b/src/main/resources/handlebars/JavaInflector/pom.mustache index a79dd4344c..dabf47f8cf 100644 --- a/src/main/resources/handlebars/JavaInflector/pom.mustache +++ b/src/main/resources/handlebars/JavaInflector/pom.mustache @@ -117,6 +117,10 @@ + {{#java11}} + 11 + 11 + {{/java11}} UTF-8 1.0.0 9.4.9.v20180320 diff --git a/src/main/resources/handlebars/JavaJaxRS/cxf-cdi/pom.mustache b/src/main/resources/handlebars/JavaJaxRS/cxf-cdi/pom.mustache index 070c9f7c2b..9851b195cb 100644 --- a/src/main/resources/handlebars/JavaJaxRS/cxf-cdi/pom.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/cxf-cdi/pom.mustache @@ -98,4 +98,11 @@ + {{#java11}} + + 11 + 11 + + {{/java11}} + diff --git a/src/main/resources/handlebars/JavaJaxRS/cxf/pom.mustache b/src/main/resources/handlebars/JavaJaxRS/cxf/pom.mustache index 0a91a003b2..78c26d56ac 100644 --- a/src/main/resources/handlebars/JavaJaxRS/cxf/pom.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/cxf/pom.mustache @@ -215,7 +215,7 @@ - {{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}} + {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} ${java.version} ${java.version} {{#useOas2}} diff --git a/src/main/resources/handlebars/JavaJaxRS/cxf/server/pom.mustache b/src/main/resources/handlebars/JavaJaxRS/cxf/server/pom.mustache index 467e58218d..88b8cf8ab0 100644 --- a/src/main/resources/handlebars/JavaJaxRS/cxf/server/pom.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/cxf/server/pom.mustache @@ -276,7 +276,7 @@ - {{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}} + {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} ${java.version} ${java.version} {{#useOas2}} diff --git a/src/main/resources/handlebars/JavaJaxRS/libraries/jersey1/pom.mustache b/src/main/resources/handlebars/JavaJaxRS/libraries/jersey1/pom.mustache index 6936dc4a31..4c03cfddc7 100644 --- a/src/main/resources/handlebars/JavaJaxRS/libraries/jersey1/pom.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/libraries/jersey1/pom.mustache @@ -197,7 +197,7 @@ - {{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}} + {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} ${java.version} ${java.version} 1.5.18 diff --git a/src/main/resources/handlebars/JavaJaxRS/pom.mustache b/src/main/resources/handlebars/JavaJaxRS/pom.mustache index a20ab5d228..6888f74e55 100644 --- a/src/main/resources/handlebars/JavaJaxRS/pom.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/pom.mustache @@ -223,7 +223,7 @@ - {{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}} + {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} ${java.version} ${java.version} {{#useOas2}} diff --git a/src/main/resources/handlebars/JavaJaxRS/resteasy/eap/pom.mustache b/src/main/resources/handlebars/JavaJaxRS/resteasy/eap/pom.mustache index 3d7a8bff75..2b3e981440 100644 --- a/src/main/resources/handlebars/JavaJaxRS/resteasy/eap/pom.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/resteasy/eap/pom.mustache @@ -14,8 +14,8 @@ maven-compiler-plugin 3.6.1 - {{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}} - {{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}} + {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} + {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} diff --git a/src/main/resources/handlebars/JavaJaxRS/resteasy/pom.mustache b/src/main/resources/handlebars/JavaJaxRS/resteasy/pom.mustache index 46373c555c..70a6016cfe 100644 --- a/src/main/resources/handlebars/JavaJaxRS/resteasy/pom.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/resteasy/pom.mustache @@ -14,8 +14,8 @@ maven-compiler-plugin 3.6.1 - {{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}} - {{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}} + {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} + {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} diff --git a/src/main/resources/handlebars/JavaJaxRS/spec/pom.mustache b/src/main/resources/handlebars/JavaJaxRS/spec/pom.mustache index 049ba9dc6e..4a8e89beb4 100644 --- a/src/main/resources/handlebars/JavaJaxRS/spec/pom.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/spec/pom.mustache @@ -35,6 +35,24 @@ {{/interfaceOnly}} + {{#java11}} + + + jdk11 + + [11,) + + + + com.sun.xml.ws + jaxws-rt + 2.3.3 + pom + + + + + {{/java11}} javax.ws.rs @@ -95,6 +113,10 @@ {{/useBeanValidation}} + {{#java11}} + 11 + 11 + {{/java11}} 4.13.1 diff --git a/src/main/resources/handlebars/JavaSpring/api.mustache b/src/main/resources/handlebars/JavaSpring/api.mustache index a14b7666bc..9df639dbd9 100644 --- a/src/main/resources/handlebars/JavaSpring/api.mustache +++ b/src/main/resources/handlebars/JavaSpring/api.mustache @@ -64,7 +64,7 @@ import java.util.Optional; {{/useOptional}} {{/jdk8-no-delegate}} {{#async}} -import java.util.concurrent.{{^jdk8}}Callable{{/jdk8}}{{#jdk8}}CompletableFuture{{/jdk8}}; +import java.util.concurrent.{{^isJava8or11}}Callable{{/isJava8or11}}{{#isJava8or11}}CompletableFuture{{/isJava8or11}}; {{/async}} {{>generatedAnnotation}} @@ -76,7 +76,7 @@ import java.util.concurrent.{{^jdk8}}Callable{{/jdk8}}{{#jdk8}}CompletableFuture {{/useOas2}} {{#operations}} public interface {{classname}} { -{{#jdk8}} +{{#isJava8or11}} {{^isDelegate}} Logger log = LoggerFactory.getLogger({{classname}}.class); @@ -96,7 +96,7 @@ public interface {{classname}} { {{#isDelegate}} {{classname}}Delegate getDelegate(); {{/isDelegate}} -{{/jdk8}} +{{/isJava8or11}} {{#operation}} {{#contents}} {{#@first}} diff --git a/src/main/resources/handlebars/JavaSpring/apiController.mustache b/src/main/resources/handlebars/JavaSpring/apiController.mustache index 812bf53fd9..4d07255f72 100644 --- a/src/main/resources/handlebars/JavaSpring/apiController.mustache +++ b/src/main/resources/handlebars/JavaSpring/apiController.mustache @@ -47,9 +47,9 @@ import javax.validation.Valid; {{/fullController}} {{^isDelegate}} import javax.servlet.http.HttpServletRequest; - {{#jdk8}} + {{#isJava8or11}} import java.util.Optional; - {{/jdk8}} + {{/isJava8or11}} {{/isDelegate}} {{^jdk8-no-delegate}} {{#useOptional}} @@ -84,13 +84,13 @@ public class {{classname}}Controller implements {{classname}} { public {{classname}}Controller({{classname}}Delegate delegate) { this.delegate = delegate; } - {{#jdk8}} + {{#isJava8or11}} @Override public {{classname}}Delegate getDelegate() { return delegate; } - {{/jdk8}} + {{/isJava8or11}} {{/isDelegate}} {{^isDelegate}} {{#fullController}} @@ -106,7 +106,7 @@ public class {{classname}}Controller implements {{classname}} { this.objectMapper = objectMapper; this.request = request; } - {{#jdk8}} + {{#isJava8or11}} @Override public Optional getObjectMapper() { @@ -117,7 +117,7 @@ public class {{classname}}Controller implements {{classname}} { public Optional getRequest() { return Optional.ofNullable(request); } - {{/jdk8}} + {{/isJava8or11}} {{/isDelegate}} {{#fullController}} diff --git a/src/main/resources/handlebars/JavaSpring/apiDelegate.mustache b/src/main/resources/handlebars/JavaSpring/apiDelegate.mustache index 884352a081..6c752ac7d1 100644 --- a/src/main/resources/handlebars/JavaSpring/apiDelegate.mustache +++ b/src/main/resources/handlebars/JavaSpring/apiDelegate.mustache @@ -2,9 +2,9 @@ package {{package}}; {{#imports}}import {{import}}; {{/imports}} -{{#jdk8}} +{{#isJava8or11}} import com.fasterxml.jackson.databind.ObjectMapper; -{{/jdk8}} +{{/isJava8or11}} {{#useOas2}} import io.swagger.annotations.*; {{/useOas2}} @@ -18,32 +18,32 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.security.SecurityRequirement; {{/useOas2}} -{{#jdk8}} +{{#isJava8or11}} import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; -{{/jdk8}} +{{/isJava8or11}} import org.springframework.http.ResponseEntity; import org.springframework.web.multipart.MultipartFile; -{{#jdk8}} +{{#isJava8or11}} import java.io.IOException; -{{/jdk8}} +{{/isJava8or11}} -{{#jdk8}} +{{#isJava8or11}} import javax.servlet.http.HttpServletRequest; -{{/jdk8}} +{{/isJava8or11}} import java.util.List; import java.util.Map; -{{#jdk8}} +{{#isJava8or11}} import java.util.Optional; -{{/jdk8}} -{{^jdk8}} +{{/isJava8or11}} +{{^isJava8or11}} {{#useOptional}} import java.util.Optional; {{/useOptional}} -{{/jdk8}} +{{/isJava8or11}} {{#async}} -import java.util.concurrent.{{^jdk8}}Callable{{/jdk8}}{{#jdk8}}CompletableFuture{{/jdk8}}; +import java.util.concurrent.{{^isJava8or11}}Callable{{/isJava8or11}}{{#isJava8or11}}CompletableFuture{{/isJava8or11}}; {{/async}} {{#operations}} @@ -53,7 +53,7 @@ import java.util.concurrent.{{^jdk8}}Callable{{/jdk8}}{{#jdk8}}CompletableFuture */ {{>generatedAnnotation}} public interface {{classname}}Delegate { -{{#jdk8}} +{{#isJava8or11}} Logger log = LoggerFactory.getLogger({{classname}}.class); @@ -68,7 +68,7 @@ public interface {{classname}}Delegate { {{#defaultInterfaces}}default Optional getAcceptHeader() { return getRequest().map(r -> r.getHeader("Accept")); }{{/defaultInterfaces}} -{{/jdk8}} +{{/isJava8or11}} {{#operation}} {{#contents}} diff --git a/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/pom.mustache b/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/pom.mustache index 9e6a9e515e..12dd3f92dd 100644 --- a/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/pom.mustache +++ b/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/pom.mustache @@ -6,7 +6,7 @@ {{artifactId}} {{artifactVersion}} - {{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}} + {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} ${java.version} ${java.version} {{#useOas2}} @@ -44,6 +44,24 @@ {{/interfaceOnly}} + {{#java11}} + + + jdk11 + + [11,) + + + + com.sun.xml.ws + jaxws-rt + 2.3.3 + pom + + + + + {{/java11}} org.springframework.boot diff --git a/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/pom.mustache b/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/pom.mustache index ec0c8eeab3..3290451339 100644 --- a/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/pom.mustache +++ b/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/pom.mustache @@ -6,7 +6,7 @@ {{artifactId}} {{artifactVersion}} - {{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}} + {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} ${java.version} ${java.version} {{#useOas2}} diff --git a/src/main/resources/handlebars/JavaSpring/libraries/spring-mvc/pom.mustache b/src/main/resources/handlebars/JavaSpring/libraries/spring-mvc/pom.mustache index 46ab3155bc..4d85d3a3b9 100644 --- a/src/main/resources/handlebars/JavaSpring/libraries/spring-mvc/pom.mustache +++ b/src/main/resources/handlebars/JavaSpring/libraries/spring-mvc/pom.mustache @@ -65,6 +65,24 @@ + {{#java11}} + + + jdk11 + + [11,) + + + + com.sun.xml.ws + jaxws-rt + 2.3.3 + pom + + + + + {{/java11}} org.slf4j @@ -206,7 +224,7 @@ - {{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}} + {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} ${java.version} ${java.version} 9.3.28.v20191105 From 69b500162e6b8b1e7c5a0d2586ddb3e5df6fbb8c Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Thu, 19 Aug 2021 16:54:32 -0500 Subject: [PATCH 011/223] updated java resttemplate library template to be thread safe --- .../libraries/resttemplate/ApiClient.mustache | 37 +++---------------- .../Java/libraries/resttemplate/api.mustache | 36 +++++++++++++++++- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/src/main/resources/handlebars/Java/libraries/resttemplate/ApiClient.mustache b/src/main/resources/handlebars/Java/libraries/resttemplate/ApiClient.mustache index 7b4cf2abad..c74ff62c8f 100644 --- a/src/main/resources/handlebars/Java/libraries/resttemplate/ApiClient.mustache +++ b/src/main/resources/handlebars/Java/libraries/resttemplate/ApiClient.mustache @@ -91,9 +91,6 @@ public class ApiClient { private RestTemplate restTemplate; private Map authentications; - - private HttpStatus statusCode; - private MultiValueMap responseHeaders; private DateFormat dateFormat; @@ -147,22 +144,6 @@ public class ApiClient { return this; } - /** - * Gets the status code of the previous request - * @return HttpStatus the status code - */ - public HttpStatus getStatusCode() { - return statusCode; - } - - /** - * Gets the response headers of the previous request - * @return MultiValueMap a map of response headers - */ - public MultiValueMap getResponseHeaders() { - return responseHeaders; - } - /** * Get authentications (key: authentication name, value: authentication). * @return Map the currently configured authentication types @@ -518,9 +499,9 @@ public class ApiClient { * @param contentType The request's Content-Type header * @param authNames The authentications to apply * @param returnType The return type into which to deserialize the response - * @return The response body in chosen type + * @return ResponseEntity<T> The response of the chosen type */ - public T invokeAPI(String path, HttpMethod method, MultiValueMap queryParams, Object body, HttpHeaders headerParams, MultiValueMap formParams, List accept, MediaType contentType, String[] authNames, ParameterizedTypeReference returnType) throws RestClientException { + public ResponseEntity invokeAPI(String path, HttpMethod method, MultiValueMap queryParams, Object body, HttpHeaders headerParams, MultiValueMap formParams, List accept, MediaType contentType, String[] authNames, ParameterizedTypeReference returnType) throws RestClientException { updateParamsForAuth(authNames, queryParams, headerParams); final UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(basePath).path(path); @@ -542,20 +523,12 @@ public class ApiClient { RequestEntity requestEntity = requestBuilder.body(selectBody(body, formParams, contentType)); ResponseEntity responseEntity = restTemplate.exchange(requestEntity, returnType); - - statusCode = responseEntity.getStatusCode(); - responseHeaders = responseEntity.getHeaders(); - if (responseEntity.getStatusCode() == HttpStatus.NO_CONTENT) { - return null; - } else if (responseEntity.getStatusCode().is2xxSuccessful()) { - if (returnType == null) { - return null; - } - return responseEntity.getBody(); + if (responseEntity.getStatusCode().is2xxSuccessful()) { + return responseEntity; } else { // The error handler built into the RestTemplate should handle 400 and 500 series errors. - throw new RestClientException("API returned " + statusCode + " and it wasn't handled by the RestTemplate error handler"); + throw new RestClientException("API returned " + responseEntity.getStatusCode() + " and it wasn't handled by the RestTemplate error handler"); } } diff --git a/src/main/resources/handlebars/Java/libraries/resttemplate/api.mustache b/src/main/resources/handlebars/Java/libraries/resttemplate/api.mustache index 8350062ef1..c4b64f5b75 100644 --- a/src/main/resources/handlebars/Java/libraries/resttemplate/api.mustache +++ b/src/main/resources/handlebars/Java/libraries/resttemplate/api.mustache @@ -23,6 +23,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; {{>generatedAnnotation}} @Component("{{package}}.{{classname}}") @@ -56,7 +57,7 @@ public class {{classname}} { *

{{code}}{{#message}} - {{message}}{{/message}} {{/responses}} {{#parameters}} - * @param {{paramName}} {{description}}{{^description}}The {{paramName}} parameter{{/description}} + * @param {{paramName}} {{description}}{{#required}} (required){{/required}}{{^required}} (optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}} {{/parameters}} {{#returnType}} * @return {{returnType}} @@ -67,7 +68,38 @@ public class {{classname}} { * @see {{summary}} Documentation {{/externalDocs}} */ + {{#isDeprecated}} + @Deprecated + {{/isDeprecated}} public {{#returnType}}{{{returnType}}} {{/returnType}}{{^returnType}}void {{/returnType}}{{operationId}}({{#parameters}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}}) throws RestClientException { + {{#returnType}} + return {{operationId}}WithHttpInfo({{#parameters}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}}).getBody(); + {{/returnType}} + {{^returnType}} + {{operationId}}WithHttpInfo({{#parameters}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}}); + {{/returnType}} + } + + /** + * {{summary}} + * {{notes}} + {{#responses}} + *

{{code}}{{#message}} - {{message}}{{/message}} + {{/responses}} + {{#parameters}} + * @param {{paramName}} {{description}}{{#required}} (required){{/required}}{{^required}} (optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}} + {{/parameters}} + * @return ResponseEntity<{{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Void{{/returnType}}> + * @throws RestClientException if an error occurs while attempting to invoke the API + {{#externalDocs}} + * {{description}} + * @see {{summary}} Documentation + {{/externalDocs}} + */ + {{#isDeprecated}} + @Deprecated + {{/isDeprecated}} + public ResponseEntity<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Void{{/returnType}}> {{operationId}}WithHttpInfo({{#parameters}}{{{dataType}}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}}) throws RestClientException { Object {{localVariablePrefix}}postBody = {{^isForm}}{{#bodyParam}}{{paramName}}{{/bodyParam}}{{^bodyParam}}null{{/bodyParam}}{{/isForm}}{{#isForm}}null{{/isForm}}; {{#parameters}} {{#required}} @@ -121,7 +153,7 @@ public class {{classname}} { String[] {{localVariablePrefix}}authNames = new String[] { {{#authMethods}}"{{name}}"{{#hasMore}}, {{/hasMore}}{{/authMethods}} }; {{#returnType}}ParameterizedTypeReference<{{{returnType}}}> {{localVariablePrefix}}returnType = new ParameterizedTypeReference<{{{returnType}}}>() {};{{/returnType}}{{^returnType}}ParameterizedTypeReference {{localVariablePrefix}}returnType = new ParameterizedTypeReference() {};{{/returnType}} - {{#returnType}}return {{/returnType}}{{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, HttpMethod.{{httpMethod}}, {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, {{localVariablePrefix}}returnType); + return {{localVariablePrefix}}apiClient.invokeAPI({{localVariablePrefix}}path, HttpMethod.{{httpMethod}}, {{localVariablePrefix}}queryParams, {{localVariablePrefix}}postBody, {{localVariablePrefix}}headerParams, {{localVariablePrefix}}formParams, {{localVariablePrefix}}accept, {{localVariablePrefix}}contentType, {{localVariablePrefix}}authNames, {{localVariablePrefix}}returnType); } {{/contents}} {{/operation}} From d2bddba6e88cb078e263dc188134a2aeb8894483 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Tue, 24 Aug 2021 17:14:38 -0500 Subject: [PATCH 012/223] fixed undefined issue on ref object properties. --- .../handlebars/htmlDocs2/js_jsonschemaview.mustache | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/resources/handlebars/htmlDocs2/js_jsonschemaview.mustache b/src/main/resources/handlebars/htmlDocs2/js_jsonschemaview.mustache index fbd2164c89..f263d005c2 100644 --- a/src/main/resources/handlebars/htmlDocs2/js_jsonschemaview.mustache +++ b/src/main/resources/handlebars/htmlDocs2/js_jsonschemaview.mustache @@ -122,6 +122,11 @@ var JSONSchemaView = (function () { this.options = options; this.isCollapsed = open <= 0; + if (this.schema.type == undefined && this.schema.$ref) { + const elements = this.schema.$ref.split('/'); + this.schema = defs[elements.pop()]; + } + // if schema is an empty object which means any JOSN this.isAny = typeof schema === 'object' && !Array.isArray(schema) && !Object.keys(schema).filter(function (k) { return ['title', 'description'].indexOf(k) === -1; From 9b58fa3ee7342ba6f51c7451762e28af782031b0 Mon Sep 17 00:00:00 2001 From: joshuafc Date: Thu, 2 Sep 2021 17:15:44 +0800 Subject: [PATCH 013/223] fix typescript-axios model type error & lost import --- .../AbstractTypeScriptClientCodegen.java | 37 +++++++++---------- .../typescript-axios/model.mustache | 3 ++ .../typescript-axios/modelGeneric.mustache | 6 +-- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java index eb1c8cf76d..77310ed1b8 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java @@ -8,17 +8,7 @@ import io.swagger.codegen.v3.ISchemaHandler; import io.swagger.codegen.v3.generators.DefaultCodegenConfig; import io.swagger.codegen.v3.generators.util.OpenAPIUtil; -import io.swagger.v3.oas.models.media.ArraySchema; -import io.swagger.v3.oas.models.media.BooleanSchema; -import io.swagger.v3.oas.models.media.ComposedSchema; -import io.swagger.v3.oas.models.media.DateSchema; -import io.swagger.v3.oas.models.media.DateTimeSchema; -import io.swagger.v3.oas.models.media.IntegerSchema; -import io.swagger.v3.oas.models.media.MapSchema; -import io.swagger.v3.oas.models.media.NumberSchema; -import io.swagger.v3.oas.models.media.ObjectSchema; -import io.swagger.v3.oas.models.media.Schema; -import io.swagger.v3.oas.models.media.StringSchema; +import io.swagger.v3.oas.models.media.*; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -238,17 +228,24 @@ public CodegenModel fromModel(String name, Schema schema, Map al @Override public String getTypeDeclaration(Schema propertySchema) { - if (propertySchema instanceof ArraySchema) { - Schema inner = ((ArraySchema) propertySchema).getItems(); - return String.format("%s<%s>", getSchemaType(propertySchema), getTypeDeclaration(inner)); - } else if (propertySchema instanceof MapSchema && hasSchemaProperties(propertySchema)) { - Schema inner = (Schema) propertySchema.getAdditionalProperties(); - return String.format("{ [key, string]: %s;}", getTypeDeclaration(inner)); + Schema inner; + if(propertySchema instanceof ArraySchema) { + ArraySchema arraySchema = (ArraySchema)propertySchema; + inner = arraySchema.getItems(); + return this.getSchemaType(propertySchema) + "<" + this.getTypeDeclaration(inner) + ">"; + } else if(propertySchema instanceof MapSchema && hasSchemaProperties(propertySchema)) { + inner = (Schema) propertySchema.getAdditionalProperties(); + return "{ [key: string]: " + this.getTypeDeclaration(inner) + "; }"; } else if (propertySchema instanceof MapSchema && hasTrueAdditionalProperties(propertySchema)) { - Schema inner = new ObjectSchema(); - return String.format("{ [key, string]: %s;}", getTypeDeclaration(inner)); + inner = new ObjectSchema(); + return "{ [key: string]: " + this.getTypeDeclaration(inner) + "; }"; + } else if(propertySchema instanceof FileSchema || propertySchema instanceof BinarySchema) { + return "Blob"; + } else if(propertySchema instanceof ObjectSchema) { + return "any"; + } else { + return super.getTypeDeclaration(propertySchema); } - return super.getTypeDeclaration(propertySchema); } @Override diff --git a/src/main/resources/handlebars/typescript-axios/model.mustache b/src/main/resources/handlebars/typescript-axios/model.mustache index f945098110..ec4f02ea5b 100644 --- a/src/main/resources/handlebars/typescript-axios/model.mustache +++ b/src/main/resources/handlebars/typescript-axios/model.mustache @@ -5,6 +5,9 @@ import { {{class}} } from './{{filename}}';{{/allOf}}{{/hasAllOf}}{{#hasOneOf}}{{#oneOf}} import { {{class}} } from './{{filename}}';{{/oneOf}}{{/hasOneOf}}{{^hasAllOf}}{{^hasOneOf}}{{#imports}} import { {{class}} } from './{{filename}}';{{/imports}}{{/hasOneOf}}{{/hasAllOf}}{{/withSeparateModelsAndApi}} +{{#imports}} +import { {{class}} } from './{{filename}}'; +{{/imports}} {{#models}}{{#model}} {{#isEnum}}{{>modelEnum}}{{/isEnum}}{{#oneOf}}{{#@first}}{{>modelOneOf}}{{/@first}}{{/oneOf}}{{#allOf}}{{#@first}}{{>modelAllOf}}{{/@first}}{{/allOf}}{{^isEnum}}{{^oneOf}}{{^allOf}}{{>modelGeneric}}{{/allOf}}{{/oneOf}}{{/isEnum}} {{/model}}{{/models}} diff --git a/src/main/resources/handlebars/typescript-axios/modelGeneric.mustache b/src/main/resources/handlebars/typescript-axios/modelGeneric.mustache index 19b00602c8..0d47fede64 100644 --- a/src/main/resources/handlebars/typescript-axios/modelGeneric.mustache +++ b/src/main/resources/handlebars/typescript-axios/modelGeneric.mustache @@ -11,13 +11,13 @@ export interface {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{ {{#vars}} /** * {{{description}}} - * @type {{braces "left"}}{{datatype}}{{braces "right"}} - * @memberof {{classname}} + * @type {{braces "left"}}{{{datatype}}}{{braces "right"}} + * @memberof {{{classname}}} {{#deprecated}} * @deprecated {{/deprecated}} */ - {{name}}{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{#isNullable}} | null{{/isNullable}}{{/isEnum}}; + {{name}}{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{datatype}}}{{#isNullable}} | null{{/isNullable}}{{/isEnum}}; {{/vars}} }{{#hasEnums}} From 4184754480d796b6e3bc905e946a6d9a32a93f78 Mon Sep 17 00:00:00 2001 From: Pavel Golikov Date: Tue, 24 Aug 2021 20:20:43 +0300 Subject: [PATCH 014/223] feat: update Java Micronaut generator to support Micronaut 3 - fix useBeanValidation option application - add support for choosing Reactive Streams implementation for generated code through library option - remove @Controller annotation from generated interfaces, as it is not @Inherited anyway - use jakarta inject implementation instead of javax, as Micronaut now uses it by default - generate stub controllers when skipSupportFiles is disabled to be able to run tests and start generated application - fix bean validation annotations - add cookies parameters support - use @Body instead of @QueryValue for form parameters generation - update pom.xml to use Micronaut 3 --- .../v3/generators/java/MicronautCodegen.java | 50 ++++- .../handlebars/JavaMicronaut/api.mustache | 18 +- .../JavaMicronaut/apiController.mustache | 53 +++++ .../JavaMicronaut/api_test.mustache | 15 +- .../JavaMicronaut/beanValidation.mustache | 2 +- .../beanValidationHeaderParams.mustache | 1 - .../beanValidationParams.mustache | 1 + .../beanValidationParamsInner.mustache | 5 + .../beanValidationPathParams.mustache | 1 - .../beanValidationQueryParams.mustache | 1 - .../JavaMicronaut/bodyParams.mustache | 2 +- .../JavaMicronaut/cookieParams.mustache | 1 + .../JavaMicronaut/formParams.mustache | 2 +- .../JavaMicronaut/headerParams.mustache | 2 +- .../handlebars/JavaMicronaut/model.mustache | 1 + .../nullableBeanValidationParams.mustache | 1 + .../JavaMicronaut/pathParams.mustache | 4 +- .../handlebars/JavaMicronaut/pojo.mustache | 5 +- .../handlebars/JavaMicronaut/pom.mustache | 200 +++++++----------- .../JavaMicronaut/publisher.mustache | 1 + .../JavaMicronaut/queryParams.mustache | 2 +- ...upportedOperationExceptionHandler.mustache | 2 +- .../java/MicronautGeneratorCodegenTest.java | 11 +- 23 files changed, 226 insertions(+), 155 deletions(-) create mode 100644 src/main/resources/handlebars/JavaMicronaut/apiController.mustache delete mode 100644 src/main/resources/handlebars/JavaMicronaut/beanValidationHeaderParams.mustache create mode 100644 src/main/resources/handlebars/JavaMicronaut/beanValidationParams.mustache create mode 100644 src/main/resources/handlebars/JavaMicronaut/beanValidationParamsInner.mustache delete mode 100644 src/main/resources/handlebars/JavaMicronaut/beanValidationPathParams.mustache delete mode 100644 src/main/resources/handlebars/JavaMicronaut/beanValidationQueryParams.mustache create mode 100644 src/main/resources/handlebars/JavaMicronaut/cookieParams.mustache create mode 100644 src/main/resources/handlebars/JavaMicronaut/nullableBeanValidationParams.mustache create mode 100644 src/main/resources/handlebars/JavaMicronaut/publisher.mustache diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/MicronautCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/MicronautCodegen.java index 91c4859f28..1711ee0de2 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/MicronautCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/MicronautCodegen.java @@ -1,5 +1,6 @@ package io.swagger.codegen.v3.generators.java; +import com.github.jknack.handlebars.Handlebars; import com.github.jknack.handlebars.Lambda; import com.google.common.collect.ImmutableMap; import io.swagger.codegen.v3.*; @@ -30,10 +31,17 @@ public class MicronautCodegen extends AbstractJavaCodegen implements BeanValidationFeatures, OptionalFeatures { private static Logger LOGGER = LoggerFactory.getLogger(MicronautCodegen.class); + private static final String DEFAULT_LIBRARY = "rxjava2"; + private static final String RXJAVA3_LIBRARY = "rxjava3"; + private static final String REACTOR_LIBRARY = "reactor"; private static final String TITLE = "title"; private static final String CONFIG_PACKAGE = "configPackage"; private static final String BASE_PACKAGE = "basePackage"; private static final String USE_TAGS = "useTags"; + private static final String USE_RXJAVA = "useRxJava"; + private static final String USE_RXJAVA2 = "useRxJava2"; + private static final String USE_RXJAVA3 = "useRxJava3"; + private static final String USE_REACTOR = "useReactor"; private static final String IMPLICIT_HEADERS = "implicitHeaders"; private static final String SKIP_SUPPORT_FILES = "skipSupportFiles"; @@ -69,12 +77,18 @@ private void init() { cliOptions.add(new CliOption(BASE_PACKAGE, "base package (invokerPackage) for generated code")); cliOptions.add(new CliOption(SKIP_SUPPORT_FILES, "skip support files such as pom.xml, mvnw, etc from code generation.")); cliOptions.add(CliOption.newBoolean(USE_TAGS, "use tags for creating interface and controller classnames")); - cliOptions.add(CliOption.newBoolean(USE_BEANVALIDATION, "Use BeanValidation API annotations")); + + CliOption useBeanValidation = CliOption.newBoolean(USE_BEANVALIDATION, "Use BeanValidation API annotations"); + useBeanValidation.setDefault("true"); + cliOptions.add(useBeanValidation); + cliOptions.add(CliOption.newBoolean(IMPLICIT_HEADERS, "Use of @ApiImplicitParams for headers.")); cliOptions.add(CliOption.newBoolean(USE_OPTIONAL, "Use Optional container for optional parameters")); - supportedLibraries.put(DEFAULT_LIBRARY, "Java Micronaut Server application."); + supportedLibraries.put(DEFAULT_LIBRARY, "Java Micronaut Server application with RxJava2 reactive streams implementation"); + supportedLibraries.put(RXJAVA3_LIBRARY, "Java Micronaut Server application with RxJava3 reactive streams implementation"); + supportedLibraries.put(REACTOR_LIBRARY, "Java Micronaut Server application with Project Reactor reactive streams implementation"); setLibrary(DEFAULT_LIBRARY); CliOption library = new CliOption(CodegenConstants.LIBRARY, "library template (sub-template) to use"); @@ -155,17 +169,18 @@ public void processOpts() { skipSupportFiles = Boolean.valueOf(additionalProperties.get(SKIP_SUPPORT_FILES).toString()); } - if (useBeanValidation) { - writePropertyBack(USE_BEANVALIDATION, useBeanValidation); - } + writePropertyBack(USE_BEANVALIDATION, useBeanValidation); if (additionalProperties.containsKey(IMPLICIT_HEADERS)) { this.setImplicitHeaders(Boolean.valueOf(additionalProperties.get(IMPLICIT_HEADERS).toString())); } - if (useOptional) { - writePropertyBack(USE_OPTIONAL, useOptional); - } + writePropertyBack(USE_OPTIONAL, useOptional); + + additionalProperties.put(USE_RXJAVA, isRxJava2Library() || isRxJava3Library()); + additionalProperties.put(USE_RXJAVA2, isRxJava2Library()); + additionalProperties.put(USE_RXJAVA3, isRxJava3Library()); + additionalProperties.put(USE_REACTOR, isReactorLibrary()); if (!skipSupportFiles) { supportingFiles.add(new SupportingFile("pom.mustache", "", "pom.xml")); @@ -175,6 +190,7 @@ public void processOpts() { supportingFiles.add(new SupportingFile("unsupportedOperationExceptionHandler.mustache", (sourceFolder + File.separator + configPackage).replace(".", File.separator), "UnsupportedOperationExceptionHandler.java")); supportingFiles.add(new SupportingFile("mainApplication.mustache", (sourceFolder + File.separator).replace(".", File.separator), "MainApplication.java")); + apiTemplateFiles.put("apiController.mustache", "Controller.java"); } addHandlebarsLambdas(additionalProperties); } @@ -529,4 +545,22 @@ public void setUseBeanValidation(boolean useBeanValidation) { public void setUseOptional(boolean useOptional) { this.useOptional = useOptional; } + + @Override + public void addHandlebarHelpers(Handlebars handlebars) { + handlebars.setInfiniteLoops(true); + super.addHandlebarHelpers(handlebars); + } + + private boolean isRxJava2Library() { + return library.equals(DEFAULT_LIBRARY); + } + + private boolean isRxJava3Library() { + return library.equals(RXJAVA3_LIBRARY); + } + + private boolean isReactorLibrary() { + return library.equals(REACTOR_LIBRARY); + } } diff --git a/src/main/resources/handlebars/JavaMicronaut/api.mustache b/src/main/resources/handlebars/JavaMicronaut/api.mustache index f10469f744..4d3ff1e97b 100644 --- a/src/main/resources/handlebars/JavaMicronaut/api.mustache +++ b/src/main/resources/handlebars/JavaMicronaut/api.mustache @@ -10,11 +10,18 @@ package {{package}}; import com.fasterxml.jackson.databind.ObjectMapper; import io.micronaut.http.*; import io.micronaut.http.annotation.*; +{{#useRxJava2}} import io.reactivex.Single; +{{/useRxJava2}} +{{#useRxJava3}} +import io.reactivex.rxjava3.core.Single; +{{/useRxJava3}} import io.swagger.v3.oas.annotations.*; import io.swagger.v3.oas.annotations.responses.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +{{#useReactor}} +import org.reactivestreams.Publisher; +import reactor.core.publisher.Mono; +{{/useReactor}} {{#useBeanValidation}} import javax.annotation.Nullable; @@ -24,11 +31,12 @@ import javax.validation.constraints.*; import java.io.IOException; import java.util.List; import java.util.Map; +{{#useOptional}} import java.util.Optional; +{{/useOptional}} {{>generatedAnnotation}} {{#operations}} -@Controller public interface {{classname}} { {{#operation}} @@ -46,8 +54,8 @@ public interface {{classname}} { }) {{/implicitHeaders}} @{{#lambda.capitalise}}{{httpMethod}}{{/lambda.capitalise}}(value = "{{{path}}}"{{#hasProduces}}, produces = { {{#produces}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/produces}} }{{/hasProduces}}{{#hasConsumes}}, consumes = {{braces "left"}}{{#consumes}}"{{{mediaType}}}"{{#hasMore}}, {{/hasMore}}{{/consumes}}{{braces "right"}}{{/hasConsumes}}) - default SinglereturnTypes}}>> {{operationId}}({{#parameters}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}},{{/hasMore}}{{/parameters}}) { - return Single.fromCallable(() -> { + default {{>publisher}}returnTypes}}>> {{operationId}}({{#parameters}}{{>queryParams}}{{>pathParams}}{{>headerParams}}{{>cookieParams}}{{>bodyParams}}{{>formParams}}{{#hasMore}},{{/hasMore}}{{/parameters}}) { + return {{#useRxJava}}Single{{/useRxJava}}{{#useReactor}}Mono{{/useReactor}}.fromCallable(() -> { throw new UnsupportedOperationException(); }); } diff --git a/src/main/resources/handlebars/JavaMicronaut/apiController.mustache b/src/main/resources/handlebars/JavaMicronaut/apiController.mustache new file mode 100644 index 0000000000..c2d2874722 --- /dev/null +++ b/src/main/resources/handlebars/JavaMicronaut/apiController.mustache @@ -0,0 +1,53 @@ +package {{package}}; + +{{#imports}} +import {{import}}; + +{{/imports}} +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.HttpResponse; +{{#useRxJava2}} +import io.reactivex.Single; +{{/useRxJava2}} +{{#useRxJava3}} +import io.reactivex.rxjava3.core.Single; +{{/useRxJava3}} +{{#useReactor}} +import org.reactivestreams.Publisher; +import reactor.core.publisher.Mono; +{{/useReactor}} + +{{#useBeanValidation}} +import javax.annotation.Nullable; +import javax.validation.Valid; +import javax.validation.constraints.*; +{{/useBeanValidation}} +import java.util.List; +import java.util.Map; +{{#useOptional}} +import java.util.Optional; +{{/useOptional}} + +{{#operations}} +@Controller +public class {{classname}}Controller implements {{classname}} { +{{#operation}} +{{#contents}} + + @Override + public {{>publisher}}returnTypes}}>> {{operationId}}({{#parameters}}{{#useBeanValidation}}{{! + Bean validation spec for path parameters (PathParam is always required) +}}{{#isPathParam}}{{>beanValidationParams}}{{/isPathParam}}{{! + Bean validation spec for any other parameters +}}{{^isPathParam}}{{>nullableBeanValidationParams}}{{/isPathParam}}{{/useBeanValidation}}{{! + Method argument type and name +}}{{>optionalDataType}} {{paramName}}{{! + Arguments separator, if required +}}{{#hasMore}}, {{/hasMore}}{{/parameters}}) { + // TODO: Implement me + return {{classname}}.super.{{operationId}}({{#parameters}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}}); + } +{{/contents}} +{{/operation}} +} +{{/operations}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/api_test.mustache b/src/main/resources/handlebars/JavaMicronaut/api_test.mustache index d965ccbd92..01df744541 100644 --- a/src/main/resources/handlebars/JavaMicronaut/api_test.mustache +++ b/src/main/resources/handlebars/JavaMicronaut/api_test.mustache @@ -5,10 +5,13 @@ package {{package}}; import io.micronaut.http.HttpResponse; import io.micronaut.http.HttpStatus; -import io.micronaut.test.annotation.MicronautTest; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import org.junit.jupiter.api.Test; +{{#useReactor}} +import reactor.core.publisher.Mono; +{{/useReactor}} -import javax.inject.Inject; +import jakarta.inject.Inject; import java.util.*; @@ -29,7 +32,13 @@ class {{classname}}ControllerTest { {{{dataType}}} {{paramName}} = {{{example}}}; {{/parameters}} try { - api.{{operationId}}({{#parameters}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}}).blockingGet(); + {{#useReactor}}Mono.from({{/useReactor}}api.{{operationId}}({{#parameters}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/parameters}}){{#useReactor}}){{/useReactor}} +{{#useRxJava}} + .blockingGet(); +{{/useRxJava}} +{{#useReactor}} + .block(); +{{/useReactor}} } catch (UnsupportedOperationException e) { assumeTrue(false, "API is not yet implemented"); } diff --git a/src/main/resources/handlebars/JavaMicronaut/beanValidation.mustache b/src/main/resources/handlebars/JavaMicronaut/beanValidation.mustache index 3e4ef612a4..0894c7cdbc 100644 --- a/src/main/resources/handlebars/JavaMicronaut/beanValidation.mustache +++ b/src/main/resources/handlebars/JavaMicronaut/beanValidation.mustache @@ -3,4 +3,4 @@ {{/required}}{{#isContainer}}{{^isPrimitiveType}}{{^isEnum}} @Valid{{/isEnum}}{{/isPrimitiveType}}{{/isContainer}}{{#isNotContainer}}{{^isPrimitiveType}} @Valid{{/isPrimitiveType}}{{/isNotContainer}} -{{>beanValidationCore}} +{{>beanValidationCore}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/beanValidationHeaderParams.mustache b/src/main/resources/handlebars/JavaMicronaut/beanValidationHeaderParams.mustache deleted file mode 100644 index 6ff580a67c..0000000000 --- a/src/main/resources/handlebars/JavaMicronaut/beanValidationHeaderParams.mustache +++ /dev/null @@ -1 +0,0 @@ -{{#required}}@NotNull {{/required}}{{^required}}@Nullable {{/required}}{{>beanValidationCore}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/beanValidationParams.mustache b/src/main/resources/handlebars/JavaMicronaut/beanValidationParams.mustache new file mode 100644 index 0000000000..b01b404811 --- /dev/null +++ b/src/main/resources/handlebars/JavaMicronaut/beanValidationParams.mustache @@ -0,0 +1 @@ +{{#useBeanValidation}}{{>beanValidationParamsInner}}{{>beanValidationCore}}{{/useBeanValidation}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/beanValidationParamsInner.mustache b/src/main/resources/handlebars/JavaMicronaut/beanValidationParamsInner.mustache new file mode 100644 index 0000000000..aaa696691e --- /dev/null +++ b/src/main/resources/handlebars/JavaMicronaut/beanValidationParamsInner.mustache @@ -0,0 +1,5 @@ +{{^isPrimitiveType}}{{^isEnum}}{{! + Non-container +}}{{^isContainer}}@Valid {{/isContainer}}{{! + Container +}}{{#isContainer}}{{#items}}{{>beanValidationParamsInner}}{{/items}}{{/isContainer}}{{/isEnum}}{{/isPrimitiveType}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/beanValidationPathParams.mustache b/src/main/resources/handlebars/JavaMicronaut/beanValidationPathParams.mustache deleted file mode 100644 index 051bd53c0a..0000000000 --- a/src/main/resources/handlebars/JavaMicronaut/beanValidationPathParams.mustache +++ /dev/null @@ -1 +0,0 @@ -{{! PathParam is always required, no @NotNull necessary }}{{>beanValidationCore}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/beanValidationQueryParams.mustache b/src/main/resources/handlebars/JavaMicronaut/beanValidationQueryParams.mustache deleted file mode 100644 index 6ff580a67c..0000000000 --- a/src/main/resources/handlebars/JavaMicronaut/beanValidationQueryParams.mustache +++ /dev/null @@ -1 +0,0 @@ -{{#required}}@NotNull {{/required}}{{^required}}@Nullable {{/required}}{{>beanValidationCore}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/bodyParams.mustache b/src/main/resources/handlebars/JavaMicronaut/bodyParams.mustache index 3fffbee7e8..8bd655d9fa 100644 --- a/src/main/resources/handlebars/JavaMicronaut/bodyParams.mustache +++ b/src/main/resources/handlebars/JavaMicronaut/bodyParams.mustache @@ -1 +1 @@ -{{#isBodyParam}}@Parameter(description = "{{{description}}}") {{#useBeanValidation}}@Valid {{/useBeanValidation}}@Body {{{dataType}}} {{paramName}}{{/isBodyParam}} \ No newline at end of file +{{#isBodyParam}}{{>nullableBeanValidationParams}}@Parameter(description = "{{{description}}}") @Body {{{dataType}}} {{paramName}}{{/isBodyParam}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/cookieParams.mustache b/src/main/resources/handlebars/JavaMicronaut/cookieParams.mustache new file mode 100644 index 0000000000..9e4c72a8ab --- /dev/null +++ b/src/main/resources/handlebars/JavaMicronaut/cookieParams.mustache @@ -0,0 +1 @@ +{{#isCookieParam}}{{>nullableBeanValidationParams}}@Parameter(description = "{{{description}}}") @CookieValue(value="{{baseName}}") {{>optionalDataType}} {{paramName}}{{/isCookieParam}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/formParams.mustache b/src/main/resources/handlebars/JavaMicronaut/formParams.mustache index 5b5e062853..f3d952c827 100644 --- a/src/main/resources/handlebars/JavaMicronaut/formParams.mustache +++ b/src/main/resources/handlebars/JavaMicronaut/formParams.mustache @@ -1 +1 @@ -{{#isFormParam}}{{#notFile}}@Parameter(description = "{{{description}}}") @QueryValue(value = "{{baseName}}") {{{dataType}}} {{paramName}}{{/notFile}}{{#isFile}}@Parameter(description = "file detail") {{#useBeanValidation}}@Valid {{/useBeanValidation}}MultipartFile {{baseName}}{{/isFile}}{{/isFormParam}} +{{#isFormParam}}{{#notFile}}{{>nullableBeanValidationParams}}@Parameter(description = "{{{description}}}") @Body(value = "{{baseName}}") {{{dataType}}} {{paramName}}{{/notFile}}{{#isFile}}@Parameter(description = "file detail") {{#useBeanValidation}}@Valid {{/useBeanValidation}}MultipartFile {{baseName}}{{/isFile}}{{/isFormParam}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/headerParams.mustache b/src/main/resources/handlebars/JavaMicronaut/headerParams.mustache index b56740532b..5f6dcf0b3e 100644 --- a/src/main/resources/handlebars/JavaMicronaut/headerParams.mustache +++ b/src/main/resources/handlebars/JavaMicronaut/headerParams.mustache @@ -1 +1 @@ -{{#isHeaderParam}}{{#useBeanValidation}}{{>beanValidationHeaderParams}}{{/useBeanValidation}}@Parameter(description = "{{{description}}}") {{#useBeanValidation}}@Valid {{/useBeanValidation}}@Header(value = "{{baseName}}") {{>optionalDataType}} {{paramName}}{{/isHeaderParam}} \ No newline at end of file +{{#isHeaderParam}}{{>nullableBeanValidationParams}}@Parameter(description = "{{{description}}}") @Header(value = "{{baseName}}") {{>optionalDataType}} {{paramName}}{{/isHeaderParam}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/model.mustache b/src/main/resources/handlebars/JavaMicronaut/model.mustache index b34290e15e..c9dedbd5ee 100644 --- a/src/main/resources/handlebars/JavaMicronaut/model.mustache +++ b/src/main/resources/handlebars/JavaMicronaut/model.mustache @@ -7,6 +7,7 @@ import java.util.Objects; import java.io.Serializable; {{/serializableModel}} {{#useBeanValidation}} +import io.micronaut.core.annotation.Introspected; import io.micronaut.validation.Validated; import javax.validation.Valid; import javax.validation.constraints.*; diff --git a/src/main/resources/handlebars/JavaMicronaut/nullableBeanValidationParams.mustache b/src/main/resources/handlebars/JavaMicronaut/nullableBeanValidationParams.mustache new file mode 100644 index 0000000000..5d387de368 --- /dev/null +++ b/src/main/resources/handlebars/JavaMicronaut/nullableBeanValidationParams.mustache @@ -0,0 +1 @@ +{{#useBeanValidation}}{{#required}}@NotNull {{/required}}{{^required}}@Nullable {{/required}}{{>beanValidationParams}}{{/useBeanValidation}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/pathParams.mustache b/src/main/resources/handlebars/JavaMicronaut/pathParams.mustache index 2e51d583bb..4ac4b0ecd0 100644 --- a/src/main/resources/handlebars/JavaMicronaut/pathParams.mustache +++ b/src/main/resources/handlebars/JavaMicronaut/pathParams.mustache @@ -1 +1,3 @@ -{{#isPathParam}}{{#useBeanValidation}}{{>beanValidationPathParams}}{{/useBeanValidation}}@Parameter(description = "{{{description}}}") @PathVariable("{{baseName}}") {{>optionalDataType}} {{paramName}}{{/isPathParam}} \ No newline at end of file +{{#isPathParam}}{{! + PathParam is always required, no @NotNull necessary +}}{{>beanValidationParams}}@Parameter(description = "{{{description}}}") @PathVariable("{{baseName}}") {{>optionalDataType}} {{paramName}}{{/isPathParam}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/pojo.mustache b/src/main/resources/handlebars/JavaMicronaut/pojo.mustache index 55669741b3..5e86ef1bcb 100644 --- a/src/main/resources/handlebars/JavaMicronaut/pojo.mustache +++ b/src/main/resources/handlebars/JavaMicronaut/pojo.mustache @@ -2,7 +2,10 @@ * {{#description}}{{.}}{{/description}}{{^description}}{{classname}}{{/description}} */{{#description}} @Schema(description = "{{{description}}}"){{/description}} -{{#useBeanValidation}}@Validated{{/useBeanValidation}} +{{#useBeanValidation}} +@Validated +@Introspected +{{/useBeanValidation}} {{>generatedAnnotation}}{{#discriminator}}{{>typeInfoAnnotation}}{{/discriminator}}{{>xmlAnnotation}} public class {{classname}} {{#parent}}extends {{{parent}}}{{/parent}} {{#serializableModel}}implements Serializable{{/serializableModel}} { {{#serializableModel}} diff --git a/src/main/resources/handlebars/JavaMicronaut/pom.mustache b/src/main/resources/handlebars/JavaMicronaut/pom.mustache index 85318c9f5f..40cefce370 100644 --- a/src/main/resources/handlebars/JavaMicronaut/pom.mustache +++ b/src/main/resources/handlebars/JavaMicronaut/pom.mustache @@ -1,73 +1,103 @@ - + + 4.0.0 {{groupId}} {{artifactId}} {{artifactVersion}} + ${packaging} + + + io.micronaut + micronaut-parent + 3.0.0 + + - 1.1.4 + jar 1.8 - UTF-8 + + + 3.0.0 {{basePackage}}.MainApplication + netty + - jcenter.bintray.com - https://jcenter.bintray.com + central + https://repo.maven.apache.org/maven2 - - - - io.micronaut - micronaut-bom - ${micronaut.version} - pom - import - - - + io.micronaut micronaut-inject compile +{{#useBeanValidation}} io.micronaut micronaut-validation compile +{{/useBeanValidation}} io.micronaut - micronaut-runtime + micronaut-http-client compile - io.swagger.core.v3 - swagger-annotations + io.micronaut + micronaut-http-server-netty compile io.micronaut - micronaut-http-client + micronaut-runtime compile - io.micronaut - micronaut-http-server-netty +{{#useRxJava2}} + io.micronaut.rxjava2 + micronaut-rxjava2 +{{/useRxJava2}} +{{#useRxJava3}} + io.micronaut.rxjava3 + micronaut-rxjava3 +{{/useRxJava3}} +{{#useReactor}} + io.micronaut.reactor + micronaut-reactor +{{/useReactor}} compile ch.qos.logback logback-classic - 1.2.3 runtime + + io.swagger.core.v3 + swagger-annotations + compile + +{{#useBeanValidation}} + + com.google.code.findbugs + jsr305 + +{{/useBeanValidation}} +{{#threetenbp}} com.github.joschi.jackson jackson-datatype-threetenbp 2.6.4 +{{/threetenbp}} +{{#generateApiTests}} + org.junit.jupiter junit-jupiter-api @@ -83,114 +113,40 @@ micronaut-test-junit5 test +{{/generateApiTests}} + - org.apache.maven.plugins - maven-shade-plugin - 3.1.0 - - - package - - shade - - - - - ${exec.mainClass} - - - - - - + io.micronaut.build + micronaut-maven-plugin + - org.codehaus.mojo - exec-maven-plugin - 1.6.0 + org.apache.maven.plugins + maven-compiler-plugin - java - - -noverify - -XX:TieredStopAtLevel=1 - -Dcom.sun.management.jmxremote - -classpath - - ${exec.mainClass} - + + + +{{#useBeanValidation}} + + + io.micronaut + micronaut-http-validation + ${micronaut.version} + + +{{/useBeanValidation}} + + -Amicronaut.processing.group={{groupId}} + -Amicronaut.processing.module={{artifactId}} + - - maven-surefire-plugin - 2.22.0 - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - ${jdk.version} - ${jdk.version} - UTF-8 - - -parameters - - - - io.micronaut - micronaut-inject-java - ${micronaut.version} - - - io.micronaut - micronaut-validation - ${micronaut.version} - - - io.micronaut.configuration - micronaut-openapi - 1.1.1 - - - - - - test-compile - - testCompile - - - - -parameters - - - - io.micronaut - micronaut-inject-java - ${micronaut.version} - - - io.micronaut - micronaut-validation - ${micronaut.version} - - - io.micronaut.configuration - micronaut-openapi - 1.1.1 - - - - - - - - + + diff --git a/src/main/resources/handlebars/JavaMicronaut/publisher.mustache b/src/main/resources/handlebars/JavaMicronaut/publisher.mustache new file mode 100644 index 0000000000..87ce619a98 --- /dev/null +++ b/src/main/resources/handlebars/JavaMicronaut/publisher.mustache @@ -0,0 +1 @@ +{{#useRxJava}}Single{{/useRxJava}}{{#useReactor}}Publisher{{/useReactor}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/queryParams.mustache b/src/main/resources/handlebars/JavaMicronaut/queryParams.mustache index eb1cbbb525..a27659430f 100644 --- a/src/main/resources/handlebars/JavaMicronaut/queryParams.mustache +++ b/src/main/resources/handlebars/JavaMicronaut/queryParams.mustache @@ -1 +1 @@ -{{#isQueryParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}@Parameter(description = "{{{description}}}") {{#useBeanValidation}}@Valid {{/useBeanValidation}}@QueryValue(value = "{{baseName}}"{{#defaultValue}}, defaultValue = "{{{defaultValue}}}"{{/defaultValue}}) {{>optionalDataType}} {{paramName}}{{/isQueryParam}} \ No newline at end of file +{{#isQueryParam}}{{>nullableBeanValidationParams}}@Parameter(description = "{{{description}}}") @QueryValue(value = "{{baseName}}"{{#defaultValue}}, defaultValue = "{{{defaultValue}}}"{{/defaultValue}}) {{>optionalDataType}} {{paramName}}{{/isQueryParam}} \ No newline at end of file diff --git a/src/main/resources/handlebars/JavaMicronaut/unsupportedOperationExceptionHandler.mustache b/src/main/resources/handlebars/JavaMicronaut/unsupportedOperationExceptionHandler.mustache index 8322cd7af4..a22f4fd6e0 100644 --- a/src/main/resources/handlebars/JavaMicronaut/unsupportedOperationExceptionHandler.mustache +++ b/src/main/resources/handlebars/JavaMicronaut/unsupportedOperationExceptionHandler.mustache @@ -8,7 +8,7 @@ import io.micronaut.http.HttpStatus; import io.micronaut.http.annotation.Produces; import io.micronaut.http.server.exceptions.ExceptionHandler; -import javax.inject.Singleton; +import jakarta.inject.Singleton; @Produces @Singleton diff --git a/src/test/java/io/swagger/codegen/v3/generators/java/MicronautGeneratorCodegenTest.java b/src/test/java/io/swagger/codegen/v3/generators/java/MicronautGeneratorCodegenTest.java index 177f1e98bd..db50d0e105 100644 --- a/src/test/java/io/swagger/codegen/v3/generators/java/MicronautGeneratorCodegenTest.java +++ b/src/test/java/io/swagger/codegen/v3/generators/java/MicronautGeneratorCodegenTest.java @@ -50,8 +50,7 @@ public void testConfigurations() { @Test(description = "verify interface api generated") public void testApiInterface() throws IOException { - final String expectedContent = "@Controller" + System.lineSeparator() - + "public interface AdminApi {"; + final String expectedContent = "public interface AdminApi {"; final File controllerFile = new File(output, "/src/main/java/io/swagger/api/AdminApi.java"); final String content = FileUtils.readFileToString(controllerFile); Assert.assertTrue(content.contains(expectedContent)); @@ -59,10 +58,10 @@ public void testApiInterface() throws IOException { @Test(description = "verify that parameters are listed as follows: header, path, query, cookie, body") public void testApiParameters() throws IOException { - final String expectedContent = "default Single> updateTest(@Parameter(description = \"Localized Text object.\") @Valid @Body LocalizedText body" + System.lineSeparator() - + ",@NotNull @Pattern(regexp=\"[0-9]+\") @Parameter(description = \"header description\") @Valid @Header(value = \"x-header\") String xHeader" + System.lineSeparator() - + ",@Parameter(description = \"path description\") @PathVariable(\"id\") Long id" + System.lineSeparator() - + ",@Nullable @Parameter(description = \"query description\") @Valid @QueryValue(value = \"name\") String name"; + final String expectedContent = "default Single> updateTest(@NotNull @Valid @Parameter(description = \"Localized Text object.\") @Body LocalizedText body" + + ",@NotNull @Pattern(regexp=\"[0-9]+\") @Parameter(description = \"header description\") @Header(value = \"x-header\") String xHeader" + + ",@Parameter(description = \"path description\") @PathVariable(\"id\") Long id" + + ",@Nullable @Parameter(description = \"query description\") @QueryValue(value = \"name\") String name"; final File controllerFile = new File(output, "/src/main/java/io/swagger/api/AdminApi.java"); final String content = FileUtils.readFileToString(controllerFile); Assert.assertTrue(content.contains(expectedContent)); From b5306d950e8ed7b4b7ee97a590495d4805956846 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Sun, 5 Sep 2021 20:22:40 -0500 Subject: [PATCH 015/223] added formatter to fix issue with date parameters --- .../v3/generators/java/SpringCodegen.java | 10 ++++++- .../JavaSpring/LocalDateConverter.mustache | 27 +++++++++++++++++++ .../LocalDateTimeConverter.mustache | 27 +++++++++++++++++++ .../libraries/spring-boot/pom.mustache | 4 +-- .../spring-boot/swagger2SpringBoot.mustache | 16 +++++++++++ .../swaggerUiConfiguration.mustache | 7 +++++ 6 files changed, 88 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/handlebars/JavaSpring/LocalDateConverter.mustache create mode 100644 src/main/resources/handlebars/JavaSpring/LocalDateTimeConverter.mustache diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java index 46e1b0327b..e3b4770efb 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java @@ -57,6 +57,8 @@ public class SpringCodegen extends AbstractJavaCodegen implements BeanValidation public static final String DEFAULT_INTERFACES = "defaultInterfaces"; public static final String SPRING_BOOT_VERSION = "springBootVersion"; public static final String SPRING_BOOT_VERSION_2 = "springBootV2"; + public static final String DATE_PATTERN = "datePattern"; + public static final String DATE_TIME_PATTERN = "dateTimePattern"; public static final String THROWS_EXCEPTION = "throwsException"; @@ -113,6 +115,8 @@ public SpringCodegen() { cliOptions.add(CliOption.newBoolean(TARGET_OPENFEIGN,"Generate for usage with OpenFeign (instead of feign)")); cliOptions.add(CliOption.newBoolean(DEFAULT_INTERFACES, "Generate default implementations for interfaces").defaultValue("true")); cliOptions.add(CliOption.newBoolean(THROWS_EXCEPTION, "Throws Exception in operation methods").defaultValue("false")); + cliOptions.add(CliOption.newBoolean(DATE_PATTERN, "use pattern for date parameters").defaultValue("true")); + cliOptions.add(CliOption.newBoolean(DATE_TIME_PATTERN, "use pattern for date time parameters").defaultValue("true")); supportedLibraries.put(DEFAULT_LIBRARY, "Spring-boot Server application using the SpringFox integration."); supportedLibraries.put(SPRING_MVC_LIBRARY, "Spring-MVC Server application using the SpringFox integration."); @@ -193,7 +197,7 @@ public void processOpts() { } additionalProperties.put("isJava8or11", this.java8 || this.java11); - this.defaultInterfaces = !(this.java8 || this.java11); + this.defaultInterfaces = this.java8 || this.java11; // set invokerPackage as basePackage if (additionalProperties.containsKey(CodegenConstants.INVOKER_PACKAGE)) { @@ -375,6 +379,10 @@ public void processOpts() { (sourceFolder + File.separator + apiPackage).replace(".", java.io.File.separator), "ApiOriginFilter.java")); supportingFiles.add(new SupportingFile("swaggerDocumentationConfig.mustache", (sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator), "SwaggerDocumentationConfig.java")); + supportingFiles.add(new SupportingFile("LocalDateConverter.mustache", + (sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator), "LocalDateConverter.java")); + supportingFiles.add(new SupportingFile("LocalDateTimeConverter.mustache", + (sourceFolder + File.separator + configPackage).replace(".", java.io.File.separator), "LocalDateTimeConverter.java")); } } else if ( this.swaggerDocketConfig && !isSpringCloudLibrary()) { supportingFiles.add(new SupportingFile("swaggerDocumentationConfig.mustache", diff --git a/src/main/resources/handlebars/JavaSpring/LocalDateConverter.mustache b/src/main/resources/handlebars/JavaSpring/LocalDateConverter.mustache new file mode 100644 index 0000000000..b930b29ee2 --- /dev/null +++ b/src/main/resources/handlebars/JavaSpring/LocalDateConverter.mustache @@ -0,0 +1,27 @@ +package {{configPackage}}; + +import org.springframework.core.convert.converter.Converter; +{{^isJava8or11}} +import org.threeten.bp.LocalDate; +import org.threeten.bp.format.DateTimeFormatter; +{{/isJava8or11}} +{{#isJava8or11}} +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +{{/isJava8or11}} + +public class LocalDateConverter implements Converter { + private final DateTimeFormatter formatter; + + public LocalDateConverter(String dateFormat) { + this.formatter = DateTimeFormatter.ofPattern(dateFormat); + } + + @Override + public LocalDate convert(String source) { + if(source == null || source.isEmpty()) { + return null; + } + return LocalDate.parse(source, this.formatter); + } +} diff --git a/src/main/resources/handlebars/JavaSpring/LocalDateTimeConverter.mustache b/src/main/resources/handlebars/JavaSpring/LocalDateTimeConverter.mustache new file mode 100644 index 0000000000..e45f5f8b32 --- /dev/null +++ b/src/main/resources/handlebars/JavaSpring/LocalDateTimeConverter.mustache @@ -0,0 +1,27 @@ +package {{configPackage}}; + +import org.springframework.core.convert.converter.Converter; +{{^isJava8or11}} +import org.threeten.bp.LocalDateTime; +import org.threeten.bp.format.DateTimeFormatter; +{{/isJava8or11}} +{{#isJava8or11}} +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +{{/isJava8or11}} + +public class LocalDateTimeConverter implements Converter { + private final DateTimeFormatter formatter; + + public LocalDateTimeConverter(String dateFormat) { + this.formatter = DateTimeFormatter.ofPattern(dateFormat); + } + + @Override + public LocalDateTime convert(String source) { + if(source == null || source.isEmpty()) { + return null; + } + return LocalDateTime.parse(source, this.formatter); + } +} diff --git a/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/pom.mustache b/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/pom.mustache index 12dd3f92dd..6a504ed061 100644 --- a/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/pom.mustache +++ b/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/pom.mustache @@ -121,13 +121,13 @@ {{/withXml}} - {{#java8}} + {{#isJava8or11}} com.fasterxml.jackson.datatype jackson-datatype-jsr310 - {{/java8}} + {{/isJava8or11}} {{#joda}} diff --git a/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/swagger2SpringBoot.mustache b/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/swagger2SpringBoot.mustache index 4ab0bfdfdd..cb3f060248 100644 --- a/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/swagger2SpringBoot.mustache +++ b/src/main/resources/handlebars/JavaSpring/libraries/spring-boot/swagger2SpringBoot.mustache @@ -1,5 +1,8 @@ package {{basePackage}}; +import {{configPackage}}.LocalDateConverter; +import {{configPackage}}.LocalDateTimeConverter; + import org.springframework.boot.CommandLineRunner; import org.springframework.boot.ExitCodeGenerator; import org.springframework.boot.SpringApplication; @@ -13,6 +16,10 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2; import springfox.documentation.oas.annotations.EnableOpenApi; {{/useOas2}} +import org.springframework.context.annotation.Configuration; +import org.springframework.format.FormatterRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + @SpringBootApplication {{#useOas2}} @EnableSwagger2 @@ -34,6 +41,15 @@ public class Swagger2SpringBoot implements CommandLineRunner { new SpringApplication(Swagger2SpringBoot.class).run(args); } + @Configuration + static class CustomDateConfig extends WebMvcConfigurerAdapter { + @Override + public void addFormatters(FormatterRegistry registry) { + registry.addConverter(new LocalDateConverter("{{#datePattern}}{{datePattern}}{{/datePattern}}{{^datePattern}}yyyy-MM-dd{{/datePattern}}")); + registry.addConverter(new LocalDateTimeConverter("{{#dateTimePattern}}{{dateTimePattern}}{{/dateTimePattern}}{{^dateTimePattern}}yyyy-MM-dd'T'HH:mm:ss.SSS{{/dateTimePattern}}")); + } + } + class ExitException extends RuntimeException implements ExitCodeGenerator { private static final long serialVersionUID = 1L; diff --git a/src/main/resources/handlebars/JavaSpring/libraries/spring-mvc/swaggerUiConfiguration.mustache b/src/main/resources/handlebars/JavaSpring/libraries/spring-mvc/swaggerUiConfiguration.mustache index 91fdef7acb..0da481857f 100644 --- a/src/main/resources/handlebars/JavaSpring/libraries/spring-mvc/swaggerUiConfiguration.mustache +++ b/src/main/resources/handlebars/JavaSpring/libraries/spring-mvc/swaggerUiConfiguration.mustache @@ -10,6 +10,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Bean; +import org.springframework.format.FormatterRegistry; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; @@ -92,6 +93,12 @@ public class SwaggerUiConfiguration extends WebMvcConfigurerAdapter { super.configureMessageConverters(converters); } + @Override + public void addFormatters(FormatterRegistry registry) { + registry.addConverter(new LocalDateConverter("{{#datePattern}}{{datePattern}}{{/datePattern}}{{^datePattern}}yyyy-MM-dd{{/datePattern}}")); + registry.addConverter(new LocalDateTimeConverter("{{#dateTimePattern}}{{dateTimePattern}}{{/dateTimePattern}}{{^dateTimePattern}}yyyy-MM-dd'T'HH:mm:ss.SSS{{/dateTimePattern}}")); + } + @Bean public ObjectMapper objectMapper(){ return builder().build(); From b63e8452d71be2f3eb4d132400fb53351b393e59 Mon Sep 17 00:00:00 2001 From: joshuafc Date: Mon, 13 Sep 2021 13:54:29 +0800 Subject: [PATCH 016/223] add async to api interfaces, and change some any to clearly types --- .../typescript-axios/apiInner.mustache | 22 +++++++++---------- .../typescript-axios/baseApi.mustache | 4 ++-- .../typescript-axios/package.mustache | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/resources/handlebars/typescript-axios/apiInner.mustache b/src/main/resources/handlebars/typescript-axios/apiInner.mustache index b0b7079022..38ea967aba 100644 --- a/src/main/resources/handlebars/typescript-axios/apiInner.mustache +++ b/src/main/resources/handlebars/typescript-axios/apiInner.mustache @@ -2,7 +2,7 @@ /* eslint-disable */ {{>licenseInfo}} -import globalAxios, { AxiosPromise, AxiosInstance } from 'axios'; +import globalAxios, { AxiosResponse, AxiosInstance, AxiosRequestConfig } from 'axios'; import { Configuration } from '{{apiRelativeToRoot}}configuration'; // Some imports not used depending on template conditions // @ts-ignore @@ -31,7 +31,7 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur * @param {*} [options] Override http request option. * @throws {RequiredError} */ - {{nickname}}: async ({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options: any = {}): Promise => { + {{nickname}}: async ({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options: AxiosRequestConfig = {}): Promise => { {{#parameters}} {{#required}} // verify required parameter '{{paramName}}' is not null or undefined @@ -48,7 +48,7 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur if (configuration) { baseOptions = configuration.baseOptions; } - const localVarRequestOptions = { method: '{{httpMethod}}', ...baseOptions, ...options}; + const localVarRequestOptions :AxiosRequestConfig = { method: '{{httpMethod}}', ...baseOptions, ...options}; const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any;{{#vendorExtensions}}{{#hasFormParams}} const localVarFormParams = new {{^multipartFormData}}URLSearchParams(){{/multipartFormData}}{{#multipartFormData}}FormData(){{/multipartFormData}};{{/hasFormParams}}{{/vendorExtensions}} @@ -187,9 +187,9 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur const query = new URLSearchParams(localVarUrlObj.search); for (const key in localVarQueryParameter) { query.set(key, localVarQueryParameter[key]); - } - for (const key in options.query) { - query.set(key, options.query[key]); + + for (const key in options.params) { + query.set(key, options.params[key]); } localVarUrlObj.search = (new URLSearchParams(query)).toString(); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; @@ -232,10 +232,10 @@ export const {{classname}}Fp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>> { + async {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise>> { const localVarAxiosArgs = await {{classname}}AxiosParamCreator(configuration).{{nickname}}({{#parameters}}{{paramName}}, {{/parameters}}options); return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => { - const axiosRequestArgs = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url}; + const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url}; return axios.request(axiosRequestArgs); }; }, @@ -264,7 +264,7 @@ export const {{classname}}Factory = function (configuration?: Configuration, bas * @param {*} [options] Override http request option. * @throws {RequiredError} */ - {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: any): AxiosPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> { + async {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise> { return {{classname}}Fp(configuration).{{nickname}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(axios, basePath)); }, {{/contents}} @@ -294,7 +294,7 @@ export interface {{classname}}Interface { * @throws {RequiredError} * @memberof {{classname}}Interface */ - {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: any): AxiosPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>; + async {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise>; {{/contents}} {{/operation}} @@ -328,7 +328,7 @@ export class {{classname}} extends BaseAPI { * @throws {RequiredError} * @memberof {{classname}} */ - public {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: any) { + public async {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig) : Promise> { return {{classname}}Fp(this.configuration).{{nickname}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(this.axios, this.basePath)); } {{^@last}} diff --git a/src/main/resources/handlebars/typescript-axios/baseApi.mustache b/src/main/resources/handlebars/typescript-axios/baseApi.mustache index 519b7c7d94..f3f826e699 100644 --- a/src/main/resources/handlebars/typescript-axios/baseApi.mustache +++ b/src/main/resources/handlebars/typescript-axios/baseApi.mustache @@ -5,7 +5,7 @@ import { Configuration } from "./configuration"; // Some imports not used depending on template conditions // @ts-ignore -import globalAxios, { AxiosPromise, AxiosInstance } from 'axios'; +import globalAxios, { AxiosRequestConfig, AxiosInstance } from 'axios'; export const BASE_PATH = "{{{basePath}}}".replace(/\/+$/, ""); @@ -27,7 +27,7 @@ export const COLLECTION_FORMATS = { */ export interface RequestArgs { url: string; - options: any; + options: AxiosRequestConfig; } /** diff --git a/src/main/resources/handlebars/typescript-axios/package.mustache b/src/main/resources/handlebars/typescript-axios/package.mustache index da07d370fa..6c6114ebcf 100644 --- a/src/main/resources/handlebars/typescript-axios/package.mustache +++ b/src/main/resources/handlebars/typescript-axios/package.mustache @@ -18,7 +18,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { - "axios": "^0.19.2" + "axios": "^0.21.1" }, "devDependencies": { "@types/node": "^12.11.5", From f9e61125df3b78295dfbac76e384494190bf0414 Mon Sep 17 00:00:00 2001 From: joshuafc Date: Mon, 13 Sep 2021 14:32:59 +0800 Subject: [PATCH 017/223] fix typo and export models --- .../resources/handlebars/typescript-axios/apiInner.mustache | 2 +- src/main/resources/handlebars/typescript-axios/index.mustache | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/handlebars/typescript-axios/apiInner.mustache b/src/main/resources/handlebars/typescript-axios/apiInner.mustache index 38ea967aba..ba324344cb 100644 --- a/src/main/resources/handlebars/typescript-axios/apiInner.mustache +++ b/src/main/resources/handlebars/typescript-axios/apiInner.mustache @@ -187,7 +187,7 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur const query = new URLSearchParams(localVarUrlObj.search); for (const key in localVarQueryParameter) { query.set(key, localVarQueryParameter[key]); - + } for (const key in options.params) { query.set(key, options.params[key]); } diff --git a/src/main/resources/handlebars/typescript-axios/index.mustache b/src/main/resources/handlebars/typescript-axios/index.mustache index b8e9eb606e..8d984020fb 100644 --- a/src/main/resources/handlebars/typescript-axios/index.mustache +++ b/src/main/resources/handlebars/typescript-axios/index.mustache @@ -4,4 +4,5 @@ export * from "./api"; export * from "./configuration"; +export * from "./models"; {{#withSeparateModelsAndApi}}export * from "./{{tsModelPackage}}";{{/withSeparateModelsAndApi}} From a2859a3c2d5eefe2e628632ef357ef6e31d976a0 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Tue, 14 Sep 2021 20:00:35 -0500 Subject: [PATCH 018/223] refactored operation parameter handling --- .../v3/generators/DefaultCodegenConfig.java | 80 ++------- .../v3/generators/OpenAPIParameters.java | 160 ++++++++++++++++++ .../nodejs/NodeJSServerCodegen.java | 3 +- 3 files changed, 178 insertions(+), 65 deletions(-) create mode 100644 src/main/java/io/swagger/codegen/v3/generators/OpenAPIParameters.java diff --git a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java index 326fb5d306..95baa02051 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java +++ b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java @@ -2117,17 +2117,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation } List parameters = operation.getParameters(); - CodegenParameter bodyParam = null; - List allParams = new ArrayList<>(); - List bodyParams = new ArrayList<>(); - List pathParams = new ArrayList<>(); - List queryParams = new ArrayList<>(); - List headerParams = new ArrayList<>(); - List cookieParams = new ArrayList<>(); - List formParams = new ArrayList<>(); - List requiredParams = new ArrayList<>(); - - List codegenContents = new ArrayList<>(); + final OpenAPIParameters openAPIParameters = new OpenAPIParameters(); RequestBody body = operation.getRequestBody(); if (body != null) { @@ -2188,20 +2178,20 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation } // todo: this segment is only to support the "older" template design. it should be removed once all templates are updated with the new {{#contents}} tag. formParameter.getVendorExtensions().put(CodegenConstants.IS_FORM_PARAM_EXT_NAME, Boolean.TRUE); - formParams.add(formParameter.copy()); + openAPIParameters.addFormParam(formParameter.copy()); if (body.getRequired() != null && body.getRequired()) { - requiredParams.add(formParameter.copy()); + openAPIParameters.addRequiredParam(formParameter.copy()); } - allParams.add(formParameter); + openAPIParameters.addAllParams(formParameter); } - codegenContents.add(codegenContent); + openAPIParameters.addCodegenContents(codegenContent); } } else { - bodyParam = fromRequestBody(body, schemaName, schema, schemas, imports); + CodegenParameter bodyParam = fromRequestBody(body, schemaName, schema, schemas, imports); + openAPIParameters.setBodyParam(bodyParam); if (foundSchemas.isEmpty()) { - // todo: this segment is only to support the "older" template design. it should be removed once all templates are updated with the new {{#contents}} tag. - bodyParams.add(bodyParam.copy()); - allParams.add(bodyParam); + openAPIParameters.addBodyParams(bodyParam.copy()); + openAPIParameters.addAllParams(bodyParam); } else { boolean alreadyAdded = false; for (Schema usedSchema : foundSchemas) { @@ -2214,7 +2204,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation } } foundSchemas.add(schema); - codegenContents.add(codegenContent); + openAPIParameters.addCodegenContents(codegenContent); } } } @@ -2225,52 +2215,24 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation param = getParameterFromRef(param.get$ref(), openAPI); } CodegenParameter codegenParameter = fromParameter(param, imports); - allParams.add(codegenParameter); - // Issue #2561 (neilotoole) : Moved setting of isParam flags - // from here to fromParameter(). - if (param instanceof QueryParameter || "query".equalsIgnoreCase(param.getIn())) { - queryParams.add(codegenParameter.copy()); - } else if (param instanceof PathParameter || "path".equalsIgnoreCase(param.getIn())) { - pathParams.add(codegenParameter.copy()); - } else if (param instanceof HeaderParameter || "header".equalsIgnoreCase(param.getIn())) { - headerParams.add(codegenParameter.copy()); - } else if (param instanceof CookieParameter || "cookie".equalsIgnoreCase(param.getIn())) { - cookieParams.add(codegenParameter.copy()); - } - if (codegenParameter.required) { - requiredParams.add(codegenParameter.copy()); - } + openAPIParameters.addParameters(param, codegenParameter); } } addOperationImports(codegenOperation, imports); - codegenOperation.bodyParam = bodyParam; + codegenOperation.bodyParam = openAPIParameters.getBodyParam(); codegenOperation.httpMethod = httpMethod.toUpperCase(); // move "required" parameters in front of "optional" parameters if (sortParamsByRequiredFlag) { - Collections.sort(allParams, new Comparator() { - @Override - public int compare(CodegenParameter one, CodegenParameter another) { - if (one.required == another.required) return 0; - else if (one.required) return -1; - else return 1; - } - }); + openAPIParameters.sortRequiredAllParams(); } - codegenOperation.allParams = addHasMore(allParams); - codegenOperation.bodyParams = addHasMore(bodyParams); - codegenOperation.pathParams = addHasMore(pathParams); - codegenOperation.queryParams = addHasMore(queryParams); - codegenOperation.headerParams = addHasMore(headerParams); - codegenOperation.cookieParams = addHasMore(cookieParams); - codegenOperation.formParams = addHasMore(formParams); - codegenOperation.requiredParams = addHasMore(requiredParams); + openAPIParameters.addHasMore(codegenOperation); codegenOperation.externalDocs = operation.getExternalDocs(); - configuresParameterForMediaType(codegenOperation, codegenContents); + configuresParameterForMediaType(codegenOperation, openAPIParameters.getCodegenContents()); // legacy support codegenOperation.nickname = codegenOperation.operationId; @@ -3002,16 +2964,6 @@ private void addHeaders(ApiResponse response, List target, Map< } } - protected static List addHasMore(List objs) { - if (objs != null) { - for (int i = 0; i < objs.size(); i++) { - objs.get(i).secondaryParam = i > 0; - objs.get(i).getVendorExtensions().put(CodegenConstants.HAS_MORE_EXT_NAME, i < objs.size() - 1); - } - } - return objs; - } - private static Map addHasMore(Map objs) { if (objs != null) { for (int i = 0; i < objs.size() - 1; i++) { @@ -4379,7 +4331,7 @@ protected void configuresParameterForMediaType(CodegenOperation codegenOperation } } ); - addHasMore(content.getParameters()); + OpenAPIParameters.addHasMore(content.getParameters()); } codegenOperation.getContents().addAll(codegenContents); } diff --git a/src/main/java/io/swagger/codegen/v3/generators/OpenAPIParameters.java b/src/main/java/io/swagger/codegen/v3/generators/OpenAPIParameters.java new file mode 100644 index 0000000000..f4ce9933a9 --- /dev/null +++ b/src/main/java/io/swagger/codegen/v3/generators/OpenAPIParameters.java @@ -0,0 +1,160 @@ +package io.swagger.codegen.v3.generators; + +import io.swagger.codegen.v3.CodegenConstants; +import io.swagger.codegen.v3.CodegenContent; +import io.swagger.codegen.v3.CodegenOperation; +import io.swagger.codegen.v3.CodegenParameter; +import io.swagger.v3.oas.models.parameters.CookieParameter; +import io.swagger.v3.oas.models.parameters.HeaderParameter; +import io.swagger.v3.oas.models.parameters.Parameter; +import io.swagger.v3.oas.models.parameters.PathParameter; +import io.swagger.v3.oas.models.parameters.QueryParameter; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class OpenAPIParameters { + + private CodegenParameter bodyParam = null; + private List allParams = new ArrayList<>(); + private List bodyParams = new ArrayList<>(); + private List pathParams = new ArrayList<>(); + private List queryParams = new ArrayList<>(); + private List headerParams = new ArrayList<>(); + private List cookieParams = new ArrayList<>(); + private List formParams = new ArrayList<>(); + private List requiredParams = new ArrayList<>(); + private List codegenContents = new ArrayList<>(); + + public void setBodyParam(CodegenParameter bodyParam) { + this.bodyParam = bodyParam; + } + + public CodegenParameter getBodyParam() { + return bodyParam; + } + + public List getAllParams() { + return allParams; + } + + public List getBodyParams() { + return bodyParams; + } + + public List getPathParams() { + return pathParams; + } + + public List getQueryParams() { + return queryParams; + } + + public List getHeaderParams() { + return headerParams; + } + + public List getCookieParams() { + return cookieParams; + } + + public List getFormParams() { + return formParams; + } + + public List getRequiredParams() { + return requiredParams; + } + + public List getCodegenContents() { + return codegenContents; + } + + public void addAllParams(CodegenParameter codegenParameter) { + allParams.add(codegenParameter); + } + + public void addBodyParams(CodegenParameter codegenParameter) { + bodyParams.add(codegenParameter); + } + + public void addPathParams(CodegenParameter codegenParameter) { + pathParams.add(codegenParameter); + } + + public void addQueryParams(CodegenParameter codegenParameter) { + queryParams.add(codegenParameter); + } + + public void addHeaderParams(CodegenParameter codegenParameter) { + headerParams.add(codegenParameter); + } + + public void addCookieParams(CodegenParameter codegenParameter) { + cookieParams.add(codegenParameter); + } + + public void addFormParam(CodegenParameter codegenParameter) { + formParams.add(codegenParameter); + } + + public void addRequiredParam(CodegenParameter codegenParameter) { + requiredParams.add(codegenParameter); + } + + public void addCodegenContents(CodegenContent codegenContent) { + codegenContents.add(codegenContent); + } + + public void addParameters(Parameter parameter, CodegenParameter codegenParameter) { + allParams.add(codegenParameter); + + if (parameter instanceof QueryParameter || "query".equalsIgnoreCase(parameter.getIn())) { + queryParams.add(codegenParameter.copy()); + } else if (parameter instanceof PathParameter || "path".equalsIgnoreCase(parameter.getIn())) { + pathParams.add(codegenParameter.copy()); + } else if (parameter instanceof HeaderParameter || "header".equalsIgnoreCase(parameter.getIn())) { + headerParams.add(codegenParameter.copy()); + } else if (parameter instanceof CookieParameter || "cookie".equalsIgnoreCase(parameter.getIn())) { + cookieParams.add(codegenParameter.copy()); + } + if (codegenParameter.required) { + requiredParams.add(codegenParameter.copy()); + } + } + + public void addHasMore(CodegenOperation codegenOperation) { + codegenOperation.allParams = addHasMore(allParams); + codegenOperation.bodyParams = addHasMore(bodyParams); + codegenOperation.pathParams = addHasMore(pathParams); + codegenOperation.queryParams = addHasMore(queryParams); + codegenOperation.headerParams = addHasMore(headerParams); + codegenOperation.cookieParams = addHasMore(cookieParams); + codegenOperation.formParams = addHasMore(formParams); + codegenOperation.requiredParams = addHasMore(requiredParams); + } + + public void sortRequiredAllParams() { + Collections.sort(allParams, (one, another) -> { + if (one.required == another.required) { + return 0; + } else if (one.required) { + return -1; + } else { + return 1; + } + }); + } + + public static List addHasMore(List codegenParameters) { + if (codegenParameters == null || codegenParameters.isEmpty()) { + return codegenParameters; + } + for (int i = 0; i < codegenParameters.size(); i++) { + codegenParameters.get(i).secondaryParam = i > 0; + codegenParameters.get(i).getVendorExtensions().put(CodegenConstants.HAS_MORE_EXT_NAME, i < codegenParameters.size() - 1); + } + return codegenParameters; + } +} diff --git a/src/main/java/io/swagger/codegen/v3/generators/nodejs/NodeJSServerCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/nodejs/NodeJSServerCodegen.java index d2814604e3..5755e48376 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/nodejs/NodeJSServerCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/nodejs/NodeJSServerCodegen.java @@ -10,6 +10,7 @@ import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; +import io.swagger.codegen.v3.generators.OpenAPIParameters; import io.swagger.codegen.v3.utils.URLPathUtil; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; @@ -452,7 +453,7 @@ protected void configuresParameterForMediaType(CodegenOperation codegenOperation addParameters(content, codegenOperation.cookieParams); } for (CodegenContent content : codegenContents) { - addHasMore(content.getParameters()); + OpenAPIParameters.addHasMore(content.getParameters()); } codegenOperation.getContents().addAll(codegenContents); } From 71f8078e474ae2dfbde88375940f7039451708fb Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Tue, 14 Sep 2021 20:09:27 -0500 Subject: [PATCH 019/223] renamed operation parameters class --- .../v3/generators/DefaultCodegenConfig.java | 30 +++++++++---------- ...rameters.java => OperationParameters.java} | 2 +- .../nodejs/NodeJSServerCodegen.java | 4 +-- 3 files changed, 18 insertions(+), 18 deletions(-) rename src/main/java/io/swagger/codegen/v3/generators/{OpenAPIParameters.java => OperationParameters.java} (99%) diff --git a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java index 95baa02051..f738dbbf8d 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java +++ b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java @@ -2117,7 +2117,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation } List parameters = operation.getParameters(); - final OpenAPIParameters openAPIParameters = new OpenAPIParameters(); + final OperationParameters operationParameters = new OperationParameters(); RequestBody body = operation.getRequestBody(); if (body != null) { @@ -2178,20 +2178,20 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation } // todo: this segment is only to support the "older" template design. it should be removed once all templates are updated with the new {{#contents}} tag. formParameter.getVendorExtensions().put(CodegenConstants.IS_FORM_PARAM_EXT_NAME, Boolean.TRUE); - openAPIParameters.addFormParam(formParameter.copy()); + operationParameters.addFormParam(formParameter.copy()); if (body.getRequired() != null && body.getRequired()) { - openAPIParameters.addRequiredParam(formParameter.copy()); + operationParameters.addRequiredParam(formParameter.copy()); } - openAPIParameters.addAllParams(formParameter); + operationParameters.addAllParams(formParameter); } - openAPIParameters.addCodegenContents(codegenContent); + operationParameters.addCodegenContents(codegenContent); } } else { CodegenParameter bodyParam = fromRequestBody(body, schemaName, schema, schemas, imports); - openAPIParameters.setBodyParam(bodyParam); + operationParameters.setBodyParam(bodyParam); if (foundSchemas.isEmpty()) { - openAPIParameters.addBodyParams(bodyParam.copy()); - openAPIParameters.addAllParams(bodyParam); + operationParameters.addBodyParams(bodyParam.copy()); + operationParameters.addAllParams(bodyParam); } else { boolean alreadyAdded = false; for (Schema usedSchema : foundSchemas) { @@ -2204,7 +2204,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation } } foundSchemas.add(schema); - openAPIParameters.addCodegenContents(codegenContent); + operationParameters.addCodegenContents(codegenContent); } } } @@ -2215,24 +2215,24 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation param = getParameterFromRef(param.get$ref(), openAPI); } CodegenParameter codegenParameter = fromParameter(param, imports); - openAPIParameters.addParameters(param, codegenParameter); + operationParameters.addParameters(param, codegenParameter); } } addOperationImports(codegenOperation, imports); - codegenOperation.bodyParam = openAPIParameters.getBodyParam(); + codegenOperation.bodyParam = operationParameters.getBodyParam(); codegenOperation.httpMethod = httpMethod.toUpperCase(); // move "required" parameters in front of "optional" parameters if (sortParamsByRequiredFlag) { - openAPIParameters.sortRequiredAllParams(); + operationParameters.sortRequiredAllParams(); } - openAPIParameters.addHasMore(codegenOperation); + operationParameters.addHasMore(codegenOperation); codegenOperation.externalDocs = operation.getExternalDocs(); - configuresParameterForMediaType(codegenOperation, openAPIParameters.getCodegenContents()); + configuresParameterForMediaType(codegenOperation, operationParameters.getCodegenContents()); // legacy support codegenOperation.nickname = codegenOperation.operationId; @@ -4331,7 +4331,7 @@ protected void configuresParameterForMediaType(CodegenOperation codegenOperation } } ); - OpenAPIParameters.addHasMore(content.getParameters()); + OperationParameters.addHasMore(content.getParameters()); } codegenOperation.getContents().addAll(codegenContents); } diff --git a/src/main/java/io/swagger/codegen/v3/generators/OpenAPIParameters.java b/src/main/java/io/swagger/codegen/v3/generators/OperationParameters.java similarity index 99% rename from src/main/java/io/swagger/codegen/v3/generators/OpenAPIParameters.java rename to src/main/java/io/swagger/codegen/v3/generators/OperationParameters.java index f4ce9933a9..5e37176e4b 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/OpenAPIParameters.java +++ b/src/main/java/io/swagger/codegen/v3/generators/OperationParameters.java @@ -14,7 +14,7 @@ import java.util.Collections; import java.util.List; -public class OpenAPIParameters { +public class OperationParameters { private CodegenParameter bodyParam = null; private List allParams = new ArrayList<>(); diff --git a/src/main/java/io/swagger/codegen/v3/generators/nodejs/NodeJSServerCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/nodejs/NodeJSServerCodegen.java index 5755e48376..24a29d3724 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/nodejs/NodeJSServerCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/nodejs/NodeJSServerCodegen.java @@ -10,7 +10,7 @@ import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; -import io.swagger.codegen.v3.generators.OpenAPIParameters; +import io.swagger.codegen.v3.generators.OperationParameters; import io.swagger.codegen.v3.utils.URLPathUtil; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; @@ -453,7 +453,7 @@ protected void configuresParameterForMediaType(CodegenOperation codegenOperation addParameters(content, codegenOperation.cookieParams); } for (CodegenContent content : codegenContents) { - OpenAPIParameters.addHasMore(content.getParameters()); + OperationParameters.addHasMore(content.getParameters()); } codegenOperation.getContents().addAll(codegenContents); } From 8d1a2b2176186f3decc87b91e1c6450fb5dc5989 Mon Sep 17 00:00:00 2001 From: Don Isaac Date: Thu, 16 Sep 2021 11:57:03 -0400 Subject: [PATCH 020/223] Typescript-Axios template improvements - (apiInner) made AxiosParamCreator and Factory interface arrow functions - (apiInner) Bug fix for @param with generic dataTypes - (modelGeneric) Fixed bug for multi-line jsdoc descriptions - (modelGeneric) Added support for examples in jsdocs - (modelGeneric) Now imports dependencies from #imports --- .gitignore | 4 + .../AbstractTypeScriptClientCodegen.java | 2 +- .../TypeScriptAxiosClientCodegen.java | 5 +- .../typescript-axios/apiInner.mustache | 480 +++++++++--------- .../typescript-axios/licenseInfo.mustache | 2 +- .../typescript-axios/modelGeneric.mustache | 24 +- 6 files changed, 272 insertions(+), 245 deletions(-) diff --git a/.gitignore b/.gitignore index 18de241bc9..a7e3653162 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,10 @@ # Log file *.log +# Temporary files +*.tmp +tmp/ + # BlueJ files *.ctxt diff --git a/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java index 66391c2052..3e9f0ddedd 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java @@ -37,7 +37,7 @@ public abstract class AbstractTypeScriptClientCodegen extends DefaultCodegenConfig { - private static final Logger LOGGER = LoggerFactory.getLogger(AbstractTypeScriptClientCodegen.class); + protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractTypeScriptClientCodegen.class); private static final String UNDEFINED_VALUE = "undefined"; diff --git a/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAxiosClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAxiosClientCodegen.java index 36994c3cf0..e9772598ba 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAxiosClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAxiosClientCodegen.java @@ -31,6 +31,9 @@ public TypeScriptAxiosClientCodegen() { super(); importMapping.clear(); outputFolder = "generated-code/typescript-axios"; + LOGGER.info("Template folder: " + this.templateDir()); + LOGGER.info("Template engine: " + this.getTemplateEngine()); + reservedWords.add("query"); } @Override @@ -162,7 +165,7 @@ public Map postProcessModels(Map objs) { cm.classFilename = cm.classname.replaceAll("([a-z0-9])([A-Z])", "$1-$2").toLowerCase(Locale.ROOT); //processed enum names - cm.imports = new TreeSet(cm.imports); + cm.imports = new TreeSet(cm.imports); // name enum with model name, e.g. StatusEnum => PetStatusEnum for (CodegenProperty var : cm.vars) { if (getBooleanValue(var, CodegenConstants.IS_ENUM_EXT_NAME)) { diff --git a/src/main/resources/handlebars/typescript-axios/apiInner.mustache b/src/main/resources/handlebars/typescript-axios/apiInner.mustache index b0b7079022..c04757551b 100644 --- a/src/main/resources/handlebars/typescript-axios/apiInner.mustache +++ b/src/main/resources/handlebars/typescript-axios/apiInner.mustache @@ -16,261 +16,267 @@ import { {{import}} } from '{{apiRelativeToRoot}}{{tsModelPackage}}'; * {{&description}}{{/description}} * @export */ -export const {{classname}}AxiosParamCreator = function (configuration?: Configuration) { - return { - {{#operation}} - {{#contents}} - /** - * {{¬es}} - {{#summary}} - * @summary {{&summary}} - {{/summary}} - {{#parameters}} - * @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} - {{/parameters}} - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - {{nickname}}: async ({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options: any = {}): Promise => { +export const {{classname}}AxiosParamCreator = (configuration?: Configuration) => ({ +{{#operation}} +{{#contents}} + + /** + * {{¬es}} + {{#summary}} + * @summary {{&summary}} + {{/summary}} {{#parameters}} - {{#required}} - // verify required parameter '{{paramName}}' is not null or undefined - if ({{paramName}} === null || {{paramName}} === undefined) { - throw new RequiredError('{{paramName}}','Required parameter {{paramName}} was null or undefined when calling {{nickname}}.'); - } - {{/required}} + * @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} {{/parameters}} - const localVarPath = `{{{path}}}`{{#pathParams}} - .replace(`{${"{{baseName}}"}}`, encodeURIComponent(String({{paramName}}))){{/pathParams}}; - // use dummy base URL string because the URL constructor only accepts absolute URLs. - const localVarUrlObj = new URL(localVarPath, 'https://example.com'); - let baseOptions; - if (configuration) { - baseOptions = configuration.baseOptions; - } - const localVarRequestOptions = { method: '{{httpMethod}}', ...baseOptions, ...options}; - const localVarHeaderParameter = {} as any; - const localVarQueryParameter = {} as any;{{#vendorExtensions}}{{#hasFormParams}} - const localVarFormParams = new {{^multipartFormData}}URLSearchParams(){{/multipartFormData}}{{#multipartFormData}}FormData(){{/multipartFormData}};{{/hasFormParams}}{{/vendorExtensions}} + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + {{nickname}}: async ({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options: any = {}): Promise => { +{{#parameters}} +{{#required}} + // verify required parameter '{{paramName}}' is not null or undefined + if ({{paramName}} === null || {{paramName}} === undefined) { + throw new RequiredError('{{paramName}}','Required parameter {{paramName}} was null or undefined when calling {{nickname}}.'); + } +{{/required}} +{{/parameters}} + const localVarPath = `{{{path}}}`{{#pathParams}} + .replace(`{${"{{baseName}}"}}`, encodeURIComponent(String({{paramName}}))){{/pathParams}}; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, 'https://example.com'); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + const localVarRequestOptions = { method: '{{httpMethod}}', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any;{{#vendorExtensions}}{{#hasFormParams}} + const localVarFormParams = new {{^multipartFormData}}URLSearchParams(){{/multipartFormData}}{{#multipartFormData}}FormData(){{/multipartFormData}};{{/hasFormParams}}{{/vendorExtensions}} - {{#authMethods}} - // authentication {{name}} required - {{#isApiKey}} - {{#isKeyInHeader}} - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? await configuration.apiKey("{{keyParamName}}") - : await configuration.apiKey; - localVarHeaderParameter["{{keyParamName}}"] = localVarApiKeyValue; - } - {{/isKeyInHeader}} - {{#isKeyInQuery}} - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? await configuration.apiKey("{{keyParamName}}") - : await configuration.apiKey; - localVarQueryParameter["{{keyParamName}}"] = localVarApiKeyValue; - } - {{/isKeyInQuery}} - {{/isApiKey}} - {{#isBasicBasic}} - // http basic authentication required - if (configuration && (configuration.username || configuration.password)) { - localVarRequestOptions["auth"] = { username: configuration.username, password: configuration.password }; - } - {{/isBasicBasic}} - {{#isBasicBearer}} - // http bearer authentication required - if (configuration && configuration.accessToken) { - const accessToken = typeof configuration.accessToken === 'function' - ? await configuration.accessToken() - : await configuration.accessToken; - localVarHeaderParameter["Authorization"] = "Bearer " + accessToken; - } - {{/isBasicBearer}} - {{#isOAuth}} - // oauth required - if (configuration && configuration.accessToken) { - const localVarAccessTokenValue = typeof configuration.accessToken === 'function' - ? await configuration.accessToken("{{name}}", [{{#each scopes}}"{{@key}}"{{^@last}}, {{/@last}}{{/each}}]) - : await configuration.accessToken; - localVarHeaderParameter["Authorization"] = "Bearer " + localVarAccessTokenValue; - } - {{/isOAuth}} +{{#authMethods}} + // authentication {{name}} required + {{#isApiKey}} + {{#isKeyInHeader}} - {{/authMethods}} - {{#queryParams}} - {{#isListContainer}} - if ({{paramName}}) { - {{#isCollectionFormatMulti}} - localVarQueryParameter['{{baseName}}'] = {{paramName}}; - {{/isCollectionFormatMulti}} - {{^isCollectionFormatMulti}} - localVarQueryParameter['{{baseName}}'] = {{paramName}}.join(COLLECTION_FORMATS.{{collectionFormat}}); - {{/isCollectionFormatMulti}} - } - {{/isListContainer}} - {{^isListContainer}} - if ({{paramName}} !== undefined) { - {{#isDateTime}} - localVarQueryParameter['{{baseName}}'] = ({{paramName}} as any instanceof Date) ? - ({{paramName}} as any).toISOString() : - {{paramName}}; - {{/isDateTime}} - {{^isDateTime}} - {{#isDate}} - localVarQueryParameter['{{baseName}}'] = ({{paramName}} as any instanceof Date) ? - ({{paramName}} as any).toISOString().substr(0,10) : - {{paramName}}; - {{/isDate}} - {{^isDate}} - localVarQueryParameter['{{baseName}}'] = {{paramName}}; - {{/isDate}} - {{/isDateTime}} - } - {{/isListContainer}} + if (configuration && configuration.apiKey) { + const localVarApiKeyValue = typeof configuration.apiKey === 'function' + ? await configuration.apiKey("{{keyParamName}}") + : await configuration.apiKey; + localVarHeaderParameter["{{keyParamName}}"] = localVarApiKeyValue; + } + {{/isKeyInHeader}} + {{#isKeyInQuery}} - {{/queryParams}} - {{#headerParams}} - {{#isListContainer}} - if ({{paramName}}) { - let mapped = {{paramName}}.map(value => ("{{{dataType}}}" !== "Array") ? JSON.stringify(value) : (value || "")); - localVarHeaderParameter['{{baseName}}'] = mapped.join(COLLECTION_FORMATS["{{collectionFormat}}"]); - } - {{/isListContainer}} - {{^isListContainer}} - if ({{paramName}} !== undefined && {{paramName}} !== null) { - {{#isString}} - localVarHeaderParameter['{{baseName}}'] = String({{paramName}}); - {{/isString}} - {{^isString}} - localVarHeaderParameter['{{baseName}}'] = String(JSON.stringify({{paramName}})); - {{/isString}} - } - {{/isListContainer}} + if (configuration && configuration.apiKey) { + const localVarApiKeyValue = typeof configuration.apiKey === 'function' + ? await configuration.apiKey("{{keyParamName}}") + : await configuration.apiKey; + localVarQueryParameter["{{keyParamName}}"] = localVarApiKeyValue; + } + {{/isKeyInQuery}} + {{/isApiKey}} + {{#isBasicBasic}} - {{/headerParams}} - {{#vendorExtensions}} - {{#formParams}} - {{#isListContainer}} - if ({{paramName}}) { - {{#isCollectionFormatMulti}} - {{paramName}}.forEach((element) => { - localVarFormParams.append('{{baseName}}', element as any); - }) - {{/isCollectionFormatMulti}} - {{^isCollectionFormatMulti}}{{^multipartFormData}} - localVarFormParams.set('{{baseName}}', {{paramName}}.join(COLLECTION_FORMATS.{{collectionFormat}}));{{/multipartFormData}}{{#multipartFormData}} - localVarFormParams.append('{{baseName}}', {{paramName}}.join(COLLECTION_FORMATS.{{collectionFormat}}));{{/multipartFormData}} - {{/isCollectionFormatMulti}} - }{{/isListContainer}} - {{^isListContainer}} - if ({{paramName}} !== undefined) { {{^multipartFormData}} - localVarFormParams.set('{{baseName}}', {{paramName}} as any);{{/multipartFormData}}{{#multipartFormData}} - localVarFormParams.append('{{baseName}}', {{paramName}} as any);{{/multipartFormData}} - } - {{/isListContainer}} - {{/formParams}}{{/vendorExtensions}} - {{#vendorExtensions}}{{#hasFormParams}}{{^multipartFormData}} - localVarHeaderParameter['Content-Type'] = 'application/x-www-form-urlencoded';{{/multipartFormData}}{{#multipartFormData}} - localVarHeaderParameter['Content-Type'] = 'multipart/form-data';{{/multipartFormData}} - {{/hasFormParams}}{{/vendorExtensions}} - {{#bodyParam}} - {{^consumes}} - localVarHeaderParameter['Content-Type'] = 'application/json'; - {{/consumes}} - {{#consumes.0}} - localVarHeaderParameter['Content-Type'] = '{{{mediaType}}}'; - {{/consumes.0}} + // http basic authentication required + if (configuration && (configuration.username || configuration.password)) { + localVarRequestOptions["auth"] = { username: configuration.username, password: configuration.password }; + } + {{/isBasicBasic}} + {{#isBasicBearer}} - {{/bodyParam}} - const query = new URLSearchParams(localVarUrlObj.search); - for (const key in localVarQueryParameter) { - query.set(key, localVarQueryParameter[key]); - } - for (const key in options.query) { - query.set(key, options.query[key]); - } - localVarUrlObj.search = (new URLSearchParams(query)).toString(); - let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; - localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; - {{#hasFormParams}} - localVarRequestOptions.data = localVarFormParams{{#vendorExtensions}}{{^multipartFormData}}.toString(){{/multipartFormData}}{{/vendorExtensions}}; - {{/hasFormParams}} - {{#bodyParam}} - const needsSerialization = (typeof {{paramName}} !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; - localVarRequestOptions.data = needsSerialization ? JSON.stringify({{paramName}} !== undefined ? {{paramName}} : {}) : ({{paramName}} || ""); - {{/bodyParam}} + // http bearer authentication required + if (configuration && configuration.accessToken) { + const accessToken = typeof configuration.accessToken === 'function' + ? await configuration.accessToken() + : await configuration.accessToken; + localVarHeaderParameter["Authorization"] = "Bearer " + accessToken; + } + {{/isBasicBearer}} + {{#isOAuth}} - return { - url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash, - options: localVarRequestOptions, - }; - }, - {{/contents}} - {{/operation}} - } -}; + // oauth required + if (configuration && configuration.accessToken) { + const localVarAccessTokenValue = typeof configuration.accessToken === 'function' + ? await configuration.accessToken("{{name}}", [{{#each scopes}}"{{@key}}"{{^@last}}, {{/@last}}{{/each}}]) + : await configuration.accessToken; + localVarHeaderParameter["Authorization"] = "Bearer " + localVarAccessTokenValue; + } + {{/isOAuth}} + +{{/authMethods}} +{{#queryParams}} + {{#isListContainer}} + if ({{paramName}}) { + {{#isCollectionFormatMulti}} + localVarQueryParameter['{{baseName}}'] = {{paramName}}; + {{/isCollectionFormatMulti}} + {{^isCollectionFormatMulti}} + localVarQueryParameter['{{baseName}}'] = {{paramName}}.join(COLLECTION_FORMATS.{{collectionFormat}}); + {{/isCollectionFormatMulti}} + } + {{/isListContainer}} + {{^isListContainer}} + if ({{paramName}} !== undefined) { + {{#isDateTime}} + localVarQueryParameter['{{baseName}}'] = ({{paramName}} as any instanceof Date) ? + ({{paramName}} as any).toISOString() : + {{paramName}}; + {{/isDateTime}} + {{^isDateTime}} + {{#isDate}} + localVarQueryParameter['{{baseName}}'] = ({{paramName}} as any instanceof Date) ? + ({{paramName}} as any).toISOString().substr(0,10) : + {{paramName}}; + {{/isDate}} + {{^isDate}} + localVarQueryParameter['{{baseName}}'] = {{paramName}}; + {{/isDate}} + {{/isDateTime}} + } + {{/isListContainer}} + +{{/queryParams}} +{{#headerParams}} + {{#isListContainer}} + if ({{paramName}}) { + let mapped = {{paramName}}.map(value => ("{{{dataType}}}" !== "Array") ? JSON.stringify(value) : (value || "")); + localVarHeaderParameter['{{baseName}}'] = mapped.join(COLLECTION_FORMATS["{{collectionFormat}}"]); + } + {{/isListContainer}} + {{^isListContainer}} + if ({{paramName}} !== undefined && {{paramName}} !== null) { + {{#isString}} + localVarHeaderParameter['{{baseName}}'] = String({{paramName}}); + {{/isString}} + {{^isString}} + localVarHeaderParameter['{{baseName}}'] = String(JSON.stringify({{paramName}})); + {{/isString}} + } + {{/isListContainer}} + +{{/headerParams}} +{{#vendorExtensions}} +{{#formParams}} + {{#isListContainer}} + if ({{paramName}}) { + {{#isCollectionFormatMulti}} + {{paramName}}.forEach((element) => { + localVarFormParams.append('{{baseName}}', element as any); + }) + {{/isCollectionFormatMulti}} + {{^isCollectionFormatMulti}}{{^multipartFormData}} + localVarFormParams.set('{{baseName}}', {{paramName}}.join(COLLECTION_FORMATS.{{collectionFormat}}));{{/multipartFormData}}{{#multipartFormData}} + localVarFormParams.append('{{baseName}}', {{paramName}}.join(COLLECTION_FORMATS.{{collectionFormat}}));{{/multipartFormData}} + {{/isCollectionFormatMulti}} + }{{/isListContainer}} + {{^isListContainer}} + if ({{paramName}} !== undefined) { {{^multipartFormData}} + localVarFormParams.set('{{baseName}}', {{paramName}} as any);{{/multipartFormData}}{{#multipartFormData}} + localVarFormParams.append('{{baseName}}', {{paramName}} as any);{{/multipartFormData}} + } + {{/isListContainer}} +{{/formParams}}{{/vendorExtensions}} +{{#vendorExtensions}}{{#hasFormParams}}{{^multipartFormData}} + localVarHeaderParameter['Content-Type'] = 'application/x-www-form-urlencoded';{{/multipartFormData}}{{#multipartFormData}} + localVarHeaderParameter['Content-Type'] = 'multipart/form-data';{{/multipartFormData}} +{{/hasFormParams}}{{/vendorExtensions}} +{{#bodyParam}} + {{^consumes}} + localVarHeaderParameter['Content-Type'] = 'application/json'; + {{/consumes}} + {{#consumes.0}} + localVarHeaderParameter['Content-Type'] = '{{{mediaType}}}'; + {{/consumes.0}} + +{{/bodyParam}} + const query = new URLSearchParams(localVarUrlObj.search); + for (const key in localVarQueryParameter) { + query.set(key, localVarQueryParameter[key]); + } + for (const key in options.query) { + query.set(key, options.query[key]); + } + localVarUrlObj.search = (new URLSearchParams(query)).toString(); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; +{{#hasFormParams}} + localVarRequestOptions.data = localVarFormParams{{#vendorExtensions}}{{^multipartFormData}}.toString(){{/multipartFormData}}{{/vendorExtensions}}; +{{/hasFormParams}} +{{#bodyParam}} + const needsSerialization = (typeof {{paramName}} !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; + localVarRequestOptions.data = needsSerialization ? JSON.stringify({{paramName}} !== undefined ? {{paramName}} : {}) : ({{paramName}} || ""); +{{/bodyParam}} + + return { + url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash, + options: localVarRequestOptions, + }; + }, +{{/contents}} +{{/operation}} +}); /** * {{classname}} - functional programming interface{{#description}} * {{{description}}}{{/description}} * @export */ -export const {{classname}}Fp = function(configuration?: Configuration) { - return { - {{#operation}} - {{#contents}} - /** - * {{¬es}} - {{#summary}} - * @summary {{&summary}} - {{/summary}} - {{#parameters}} - * @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} - {{/parameters}} - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - async {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>> { - const localVarAxiosArgs = await {{classname}}AxiosParamCreator(configuration).{{nickname}}({{#parameters}}{{paramName}}, {{/parameters}}options); - return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => { - const axiosRequestArgs = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url}; - return axios.request(axiosRequestArgs); - }; - }, - {{/contents}} - {{/operation}} - } -}; +export const {{classname}}Fp = (configuration?: Configuration) => ({ +{{#operation}} +{{#contents}} + + /** + * {{¬es}} + {{#summary}} + * @summary {{&summary}} + {{/summary}} + {{#parameters}} + * @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} + {{/parameters}} + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: any): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>> { + const localVarAxiosArgs = await {{classname}}AxiosParamCreator(configuration).{{nickname}}({{#parameters}}{{paramName}}, {{/parameters}}options); + return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => { + const axiosRequestArgs = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url}; + return axios.request(axiosRequestArgs); + }; + }, +{{/contents}} +{{/operation}} +}); /** * {{classname}} - factory interface{{#description}} * {{&description}}{{/description}} * @export */ -export const {{classname}}Factory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { - return { - {{#operation}} - {{#contents}} - /** - * {{¬es}} - {{#summary}} - * @summary {{&summary}} - {{/summary}} - {{#parameters}} - * @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} - {{/parameters}} - * @param {*} [options] Override http request option. - * @throws {RequiredError} - */ - {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: any): AxiosPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> { - return {{classname}}Fp(configuration).{{nickname}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(axios, basePath)); - }, - {{/contents}} - {{/operation}} - }; -}; +export const {{classname}}Factory = ( + configuration?: Configuration, + basePath?: string, + axios?: AxiosInstance +) => ({ +{{#operation}} +{{#contents}} + + /** + * {{¬es}} + {{#summary}} + * @summary {{&summary}} + {{/summary}} + {{#parameters}} + * @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} + {{/parameters}} + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: any): AxiosPromise<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> { + return {{classname}}Fp(configuration).{{nickname}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(axios, basePath)); + }, +{{/contents}} +{{/operation}} +}); {{#withInterfaces}} /** @@ -282,6 +288,7 @@ export const {{classname}}Factory = function (configuration?: Configuration, bas export interface {{classname}}Interface { {{#operation}} {{#contents}} + /** * {{¬es}} {{#summary}} @@ -316,13 +323,14 @@ export class {{classname}} extends BaseAPI { {{/withInterfaces}} {{#operation}} {{#contents}} + /** * {{¬es}} {{#summary}} * @summary {{&summary}} {{/summary}} {{#parameters}} - * @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} + * @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} {{/parameters}} * @param {*} [options] Override http request option. * @throws {RequiredError} diff --git a/src/main/resources/handlebars/typescript-axios/licenseInfo.mustache b/src/main/resources/handlebars/typescript-axios/licenseInfo.mustache index 7d61c4ee05..bbd8742e52 100644 --- a/src/main/resources/handlebars/typescript-axios/licenseInfo.mustache +++ b/src/main/resources/handlebars/typescript-axios/licenseInfo.mustache @@ -8,4 +8,4 @@ * NOTE: This class is auto generated by the swagger code generator program. * https://github.com/swagger-api/swagger-codegen.git * Do not edit the class manually. - */ \ No newline at end of file + */ diff --git a/src/main/resources/handlebars/typescript-axios/modelGeneric.mustache b/src/main/resources/handlebars/typescript-axios/modelGeneric.mustache index 19b00602c8..34c4f7deff 100644 --- a/src/main/resources/handlebars/typescript-axios/modelGeneric.mustache +++ b/src/main/resources/handlebars/typescript-axios/modelGeneric.mustache @@ -1,5 +1,10 @@ +import { + {{#imports}}{{.}},{{/imports}} +} from "."; + /** * {{{description}}} + * * @export * @interface {{classname}} */ @@ -9,24 +14,31 @@ export interface {{classname}} {{#parent}}extends {{{parent}}} {{/parent}}{ {{/additionalPropertiesType}} {{#vars}} + /** - * {{{description}}} - * @type {{braces "left"}}{{datatype}}{{braces "right"}} + {{#description}} + * {{{.}}} + * + {{/description}} + * @type {{braces "left"}}{{{datatype}}}{{braces "right"}} * @memberof {{classname}} + {{#example}} + * @example {{{.}}} + {{/example}} {{#deprecated}} * @deprecated {{/deprecated}} */ - {{name}}{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{#isNullable}} | null{{/isNullable}}{{/isEnum}}; + {{name}}{{^required}}?{{/required}}: {{#isEnum}}{{{datatypeWithEnum}}}{{/isEnum}}{{^isEnum}}{{{datatype}}}{{#isNullable}} | null{{/isNullable}}{{/isEnum}}; {{/vars}} }{{#hasEnums}} {{#vars}} {{#isEnum}} /** - * @export - * @enum {string} - */ + * @export + * @enum {string} + */ export enum {{enumName}} { {{#allowableValues}} {{#enumVars}} From 473c62604af43882c61b5997501543e0af628bed Mon Sep 17 00:00:00 2001 From: Don Isaac Date: Thu, 16 Sep 2021 13:59:41 -0400 Subject: [PATCH 021/223] Added custom options to typescript-axios generator - (generator/typescript-axios) Added npmName, npmVersion, and npmRepository custom options support - (templates/typescript-axios) Minor style improvements - (docs) Fixed typos in README.md --- README.md | 12 +-- .../TypeScriptAxiosClientCodegen.java | 93 +++++++++++++++++-- .../typescript-axios/apiInner.mustache | 4 + .../typescript-axios/configuration.mustache | 8 ++ 4 files changed, 103 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 8689759411..e432d7486c 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ## Overview **Swagger Codegen Generators** project is a set of classes and templates ([Handlebars](https://jknack.github.io/handlebars.java)) used by [Swagger Codegen 3.0.0 project](https://github.com/swagger-api/swagger-codegen/tree/3.0.0) in its code generation process for a specific language or language framework. The main differents with **Swagger Codegen 2.x.x** are: -- **Handlebars as template engine:** with Handelbars feature is possible to create more logic-less templates. +- **Handlebars as template engine:** with Handlebars feature is possible to create more logic-less templates. - **OAS 3 support:** generator classes work with OpenAPI Specification V3. More details about these and more differences are referenced at [https://github.com/swagger-api/swagger-codegen/releases/tag/v3.0.0](https://github.com/swagger-api/swagger-codegen/releases/tag/v3.0.0) @@ -18,16 +18,16 @@ You need the following installed and available in your $PATH: * Java 8 (http://java.oracle.com) * Apache maven 3.0.4 or greater (http://maven.apache.org/) -## How to contribute. -Right now the templates and generators classes are migrated from [Swagger Codegen](https://github.com/swagger-api/swagger-codegen) **3.0.0** branch. +## How to Contribute. +Right now the templates and generators classes are migrated from [Swagger Codegen](https://github.com/swagger-api/swagger-codegen) **3.0.0** branch. If you want to migrate an existing language/framework, you can follow this [guide](https://github.com/swagger-api/swagger-codegen/wiki/Swagger-Codegen-migration-(swagger-codegen-generators-repository)). -Also you need to keep in mind that **Handlebars** is used as template engines and besides it's pretty similar to **Mustache** there are different that can not be ignored. So you can follow this [guide](https://github.com/swagger-api/swagger-codegen/wiki/Swagger-Codegen-migration-from-Mustache-and-Handlebars-templates.) which explains steps to migrate templates from **Mustaches** to **Handelbars**. +Also you need to keep in mind that **Handlebars** is used as the template engine. It's pretty similar to **Mustache**, but there are differences that can not be ignored. So you can follow this [guide](https://github.com/swagger-api/swagger-codegen/wiki/Swagger-Codegen-migration-from-Mustache-and-Handlebars-templates.) which explains steps to migrate templates from **Mustaches** to **Handlebars**. -## Security contact +## Security Contact Please disclose any security-related issues or vulnerabilities by emailing [security@swagger.io](mailto:security@swagger.io), instead of using the public issue tracker. -## License information on Generated Code +## License Information on Generated Code The Swagger Codegen project is intended as a benefit for users of the Swagger / Open API Specification. The project itself has the [License](#license) as specified. In addition, please understand the following points: diff --git a/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAxiosClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAxiosClientCodegen.java index e9772598ba..20a20c313d 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAxiosClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAxiosClientCodegen.java @@ -19,11 +19,15 @@ public class TypeScriptAxiosClientCodegen extends AbstractTypeScriptClientCodegen { public static final String NPM_NAME = "npmName"; + public static final String NPM_VERSION = "npmVersion"; public static final String NPM_REPOSITORY = "npmRepository"; public static final String DEFAULT_API_PACKAGE = "apis"; public static final String DEFAULT_MODEL_PACKAGE = "models"; protected String npmRepository = null; + protected String npmName = null; + protected String npmVersion = "1.0.0"; + private String tsModelPackage = ""; @@ -34,6 +38,12 @@ public TypeScriptAxiosClientCodegen() { LOGGER.info("Template folder: " + this.templateDir()); LOGGER.info("Template engine: " + this.getTemplateEngine()); reservedWords.add("query"); + + // Custom CLI options + this.cliOptions.add(new CliOption(NPM_NAME, "The name under which you want to publish generated npm package")); + this.cliOptions.add(new CliOption(NPM_VERSION, "The version of your npm package. Defaults to 1.0.0")); + this.cliOptions.add(new CliOption(NPM_REPOSITORY, + "Use this property to set an url your private npm registry in the package.json")); } @Override @@ -46,14 +56,14 @@ public String getHelp() { return "Generates a TypeScript Axios client library."; } - public String getNpmRepository() { - return npmRepository; - } - - public void setNpmRepository(String npmRepository) { - this.npmRepository = npmRepository; - } - + /** + * Creates a relative path to a file or folder. The resulting path is + * relative to the root directory of the final client library. + * + * @param path The path to the file or folder. + * @return A path to the file or folder which is relative to the client + * library root directory. + */ private static String getRelativeToRoot(String path) { StringBuilder sb = new StringBuilder(); int slashCount = path.split("/").length; @@ -102,6 +112,8 @@ public void processOpts() { supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); supportingFiles.add(new SupportingFile("package.mustache", "", "package.json")); supportingFiles.add(new SupportingFile("tsconfig.mustache", "", "tsconfig.json")); + + addNpmPackageGeneration(); } @Override @@ -194,6 +206,31 @@ public Map postProcessModels(Map objs) { return objs; } + /** + * Extracts npm package fields from `additionalProperties`. These fields + * are provided as custom CLI options. + */ + private void addNpmPackageGeneration() { + // Name of the NPM package + if (additionalProperties.containsKey(NPM_NAME)) { + this.setNpmName(additionalProperties.get(NPM_NAME).toString()); + } + + // NPM package version (SemVer) + if (additionalProperties.containsKey(NPM_VERSION)) { + this.setNpmVersion(additionalProperties.get(NPM_VERSION).toString()); + } + /* Package version has default value. Make internal version and + * additionalProperties version consistent. + */ + additionalProperties.put(NPM_VERSION, npmVersion); + + // NPM registry the package is pushed to + if (additionalProperties.containsKey(NPM_REPOSITORY)) { + this.setNpmRepository(additionalProperties.get(NPM_REPOSITORY).toString()); + } + } + /** * Overriding toRegularExpression() to avoid escapeText() being called, * as it would return a broken regular expression if any escaped character / metacharacter were present. @@ -217,4 +254,44 @@ public String toApiFilename(String name) { public String getDefaultTemplateDir() { return "typescript-axios"; } + + /** + * Gets the name of the generated NPM package. + * + * @return The NPM package name. + */ + public String getNpmName() { + return this.npmName; + } + + public void setNpmName(String npmName) { + this.npmName = npmName; + } + + /** + * Gets the generated NPM package SemVer string. + * + * @return The package version. + */ + public String getNpmVersion() { + return this.npmVersion; + } + + public void setNpmVersion(String npmVersion) { + this.npmVersion = npmVersion; + } + + /** + * Gets the name of the NPM registry the package is published to. + * + * @return The NPM registry name. + */ + public String getNpmRepository() { + return this.npmRepository; + } + + public void setNpmRepository(String npmRepository) { + this.npmRepository = npmRepository; + } + } diff --git a/src/main/resources/handlebars/typescript-axios/apiInner.mustache b/src/main/resources/handlebars/typescript-axios/apiInner.mustache index c04757551b..ccd5c0e954 100644 --- a/src/main/resources/handlebars/typescript-axios/apiInner.mustache +++ b/src/main/resources/handlebars/typescript-axios/apiInner.mustache @@ -11,6 +11,7 @@ import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } fr import { {{import}} } from '{{apiRelativeToRoot}}{{tsModelPackage}}'; {{/imports}} {{#operations}} + /** * {{classname}} - axios parameter creator{{#description}} * {{&description}}{{/description}} @@ -22,13 +23,16 @@ export const {{classname}}AxiosParamCreator = (configuration?: Configuration) => /** * {{¬es}} + * {{#summary}} * @summary {{&summary}} + * {{/summary}} {{#parameters}} * @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} {{/parameters}} * @param {*} [options] Override http request option. + * * @throws {RequiredError} */ {{nickname}}: async ({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options: any = {}): Promise => { diff --git a/src/main/resources/handlebars/typescript-axios/configuration.mustache b/src/main/resources/handlebars/typescript-axios/configuration.mustache index ae7e0dcc25..bd8e450609 100644 --- a/src/main/resources/handlebars/typescript-axios/configuration.mustache +++ b/src/main/resources/handlebars/typescript-axios/configuration.mustache @@ -12,12 +12,15 @@ export interface ConfigurationParameters { } export class Configuration { + /** * parameter for apiKey security + * * @param name security name * @memberof Configuration */ apiKey?: string | Promise | ((name: string) => string) | ((name: string) => Promise); + /** * parameter for basic security * @@ -25,6 +28,7 @@ export class Configuration { * @memberof Configuration */ username?: string; + /** * parameter for basic security * @@ -32,13 +36,16 @@ export class Configuration { * @memberof Configuration */ password?: string; + /** * parameter for oauth2 security + * * @param name security name * @param scopes oauth2 scope * @memberof Configuration */ accessToken?: string | Promise | ((name?: string, scopes?: string[]) => string) | ((name?: string, scopes?: string[]) => Promise); + /** * override base path * @@ -46,6 +53,7 @@ export class Configuration { * @memberof Configuration */ basePath?: string; + /** * base options for axios calls * From f27677a34745e1f4eecb5598f3710d6b729aa711 Mon Sep 17 00:00:00 2001 From: Don Isaac Date: Thu, 16 Sep 2021 17:34:51 -0400 Subject: [PATCH 022/223] Added CliOptions import to typescript-axios generator --- .../v3/generators/typescript/TypeScriptAxiosClientCodegen.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAxiosClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAxiosClientCodegen.java index 20a20c313d..cf2f5fa4a6 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAxiosClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAxiosClientCodegen.java @@ -1,5 +1,6 @@ package io.swagger.codegen.v3.generators.typescript; +import io.swagger.codegen.v3.CliOption; import io.swagger.codegen.v3.CodegenConstants; import io.swagger.codegen.v3.CodegenModel; import io.swagger.codegen.v3.CodegenOperation; From 7c9cac36a369316e6c5b4525707f79168191cf65 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Thu, 16 Sep 2021 22:02:24 -0500 Subject: [PATCH 023/223] convert schema from deepObject style parameter into query parameter. --- .../v3/generators/DefaultCodegenConfig.java | 5 ++ .../v3/generators/OperationParameters.java | 46 +++++++++++++++++++ .../v3/generators/util/OpenAPIUtil.java | 11 +++++ 3 files changed, 62 insertions(+) diff --git a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java index f738dbbf8d..26ece16059 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java +++ b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java @@ -2214,6 +2214,11 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation if (StringUtils.isNotBlank(param.get$ref())) { param = getParameterFromRef(param.get$ref(), openAPI); } + if ((param instanceof QueryParameter || "query".equalsIgnoreCase(param.getIn())) + && param.getStyle().equals(Parameter.StyleEnum.DEEPOBJECT)) { + operationParameters.parseNestedObjects(param.getName(), param.getSchema(), imports, this, openAPI); + continue; + } CodegenParameter codegenParameter = fromParameter(param, imports); operationParameters.addParameters(param, codegenParameter); } diff --git a/src/main/java/io/swagger/codegen/v3/generators/OperationParameters.java b/src/main/java/io/swagger/codegen/v3/generators/OperationParameters.java index 5e37176e4b..7cf06a29f1 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/OperationParameters.java +++ b/src/main/java/io/swagger/codegen/v3/generators/OperationParameters.java @@ -4,6 +4,10 @@ import io.swagger.codegen.v3.CodegenContent; import io.swagger.codegen.v3.CodegenOperation; import io.swagger.codegen.v3.CodegenParameter; +import io.swagger.codegen.v3.generators.util.OpenAPIUtil; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.media.ArraySchema; +import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.parameters.CookieParameter; import io.swagger.v3.oas.models.parameters.HeaderParameter; import io.swagger.v3.oas.models.parameters.Parameter; @@ -13,6 +17,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.Set; public class OperationParameters { @@ -147,6 +153,40 @@ public void sortRequiredAllParams() { }); } + public void parseNestedObjects(String name, Schema schema, Set imports, DefaultCodegenConfig codegenConfig, OpenAPI openAPI) { + schema = OpenAPIUtil.getRefSchemaIfExists(schema, openAPI); + if (schema == null || !isObjectWithProperties(schema)) { + return; + } + final Map properties = schema.getProperties(); + for (String key : properties.keySet()) { + Schema property = properties.get(key); + property = OpenAPIUtil.getRefSchemaIfExists(property, openAPI); + boolean required; + if (schema.getRequired() == null || schema.getRequired().isEmpty()) { + required = false; + } else { + required = schema.getRequired().stream().anyMatch(propertyName -> key.equalsIgnoreCase(propertyName.toString())); + } + final String parameterName; + if (property instanceof ArraySchema) { + parameterName = String.format("%s[%s][]", name, key); + } else { + parameterName = String.format("%s[%s]", name, key); + } + if (isObjectWithProperties(property)) { + parseNestedObjects(parameterName, property, imports, codegenConfig, openAPI); + continue; + } + final Parameter queryParameter = new QueryParameter() + .name(parameterName) + .required(required) + .schema(property); + final CodegenParameter codegenParameter = codegenConfig.fromParameter(queryParameter, imports); + addParameters(queryParameter, codegenParameter); + } + } + public static List addHasMore(List codegenParameters) { if (codegenParameters == null || codegenParameters.isEmpty()) { return codegenParameters; @@ -157,4 +197,10 @@ public static List addHasMore(List codegenPa } return codegenParameters; } + + private boolean isObjectWithProperties(Schema schema) { + return ("object".equalsIgnoreCase(schema.getType()) || schema.getType() == null) + && schema.getProperties() != null + && !schema.getProperties().isEmpty(); + } } diff --git a/src/main/java/io/swagger/codegen/v3/generators/util/OpenAPIUtil.java b/src/main/java/io/swagger/codegen/v3/generators/util/OpenAPIUtil.java index f6a47bc7b9..bd7c3b2408 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/util/OpenAPIUtil.java +++ b/src/main/java/io/swagger/codegen/v3/generators/util/OpenAPIUtil.java @@ -51,6 +51,17 @@ public static Schema getSchemaFromName(String name, OpenAPI openAPI) { return mapSchema.get(name); } + public static Schema getRefSchemaIfExists(Schema schema, OpenAPI openAPI) { + if (schema == null) { + return null; + } + if (StringUtils.isBlank(schema.get$ref()) || openAPI == null || openAPI.getComponents() == null) { + return schema; + } + final String name = getSimpleRef(schema.get$ref()); + return getSchemaFromName(name, openAPI); + } + public static Schema getSchemaFromRefSchema(Schema refSchema, OpenAPI openAPI) { if (StringUtils.isBlank(refSchema.get$ref())) { return null; From 7c3ed54db35355a8f26c4c54318b116fc2595996 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Thu, 16 Sep 2021 23:15:35 -0500 Subject: [PATCH 024/223] check style property is not null in schema --- .../io/swagger/codegen/v3/generators/DefaultCodegenConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java index 26ece16059..10db850c7a 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java +++ b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java @@ -2215,7 +2215,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation param = getParameterFromRef(param.get$ref(), openAPI); } if ((param instanceof QueryParameter || "query".equalsIgnoreCase(param.getIn())) - && param.getStyle().equals(Parameter.StyleEnum.DEEPOBJECT)) { + && param.getStyle() != null && param.getStyle().equals(Parameter.StyleEnum.DEEPOBJECT)) { operationParameters.parseNestedObjects(param.getName(), param.getSchema(), imports, this, openAPI); continue; } From 854ed4e1ff8e3d33205b8525e0debf6628afa625 Mon Sep 17 00:00:00 2001 From: gracekarina Date: Wed, 15 Sep 2021 16:41:04 -0500 Subject: [PATCH 025/223] added option gitRepoBaseURL for PHP generator --- .../v3/generators/DefaultCodegenConfig.java | 22 ++++++++++++++++++- .../v3/generators/php/AbstractPhpCodegen.java | 2 +- .../v3/generators/php/PhpClientCodegen.java | 10 +++++++-- .../resources/handlebars/php/README.mustache | 2 +- .../handlebars/php/git_push.sh.mustache | 6 ++--- 5 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java index 326fb5d306..aa3bf5c2e7 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java +++ b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java @@ -160,7 +160,7 @@ public abstract class DefaultCodegenConfig implements CodegenConfig { protected Boolean sortParamsByRequiredFlag = true; protected Boolean ensureUniqueParams = true; protected Boolean allowUnicodeIdentifiers = false; - protected String gitUserId, gitRepoId, releaseNote; + protected String gitUserId, gitRepoId, releaseNote, gitRepoBaseURL; protected String httpUserAgent; protected Boolean hideGenerationTimestamp = true; protected TemplateEngine templateEngine = new HandlebarTemplateEngine(this); @@ -3562,6 +3562,26 @@ public String getGitRepoId() { return gitRepoId; } + + /** + * Git repo Base URL + * + * @return Git repo Base URL + */ + public String getGitRepoBaseURL() { + return gitRepoBaseURL; + } + + /** + * Set Git repo Base URL. + * + * @param gitRepoBaseURL Git repo Base URL + */ + public void setGitRepoBaseURL(String gitRepoBaseURL) { + this.gitRepoBaseURL = gitRepoBaseURL; + } + + /** * Set release note. * diff --git a/src/main/java/io/swagger/codegen/v3/generators/php/AbstractPhpCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/php/AbstractPhpCodegen.java index 51dad7e72d..62c8b9f953 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/php/AbstractPhpCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/php/AbstractPhpCodegen.java @@ -251,7 +251,7 @@ public String toSrcPath(String packageName, String basePath) { } @Override - public String escapeReservedWord(String name) { + public String escapeReservedWord(String name) { if(this.reservedWordsMappings().containsKey(name)) { return this.reservedWordsMappings().get(name); } diff --git a/src/main/java/io/swagger/codegen/v3/generators/php/PhpClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/php/PhpClientCodegen.java index b0cb199fa3..8023500f92 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/php/PhpClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/php/PhpClientCodegen.java @@ -110,8 +110,7 @@ public PhpClientCodegen() { instantiationTypes.put("array", "array"); instantiationTypes.put("map", "map"); - - + // provide primitives to mustache template List sortedLanguageSpecificPrimitives= new ArrayList(languageSpecificPrimitives); Collections.sort(sortedLanguageSpecificPrimitives); @@ -152,6 +151,7 @@ public PhpClientCodegen() { cliOptions.add(new CliOption(CodegenConstants.GIT_USER_ID, CodegenConstants.GIT_USER_ID_DESC)); cliOptions.add(new CliOption(COMPOSER_PROJECT_NAME, "The project name used in the composer package name. The template uses {{composerVendorName}}/{{composerProjectName}} for the composer package name. e.g. petstore-client. IMPORTANT NOTE (2016/03): composerProjectName will be deprecated and replaced by gitRepoId in the next swagger-codegen release")); cliOptions.add(new CliOption(CodegenConstants.GIT_REPO_ID, CodegenConstants.GIT_REPO_ID_DESC)); + cliOptions.add(new CliOption(CodegenConstants.GIT_REPO_BASE_URL, CodegenConstants.GIT_REPO_BASE_URL_DESC)); cliOptions.add(new CliOption(CodegenConstants.ARTIFACT_VERSION, "The version to use in the composer package version field. e.g. 1.2.3")); cliOptions.add(new CliOption(CodegenConstants.HIDE_GENERATION_TIMESTAMP, "hides the timestamp when files were generated") .defaultValue(Boolean.TRUE.toString())); @@ -280,6 +280,12 @@ public void processOpts() { additionalProperties.put(CodegenConstants.GIT_REPO_ID, gitRepoId); } + if (additionalProperties.containsKey(CodegenConstants.GIT_REPO_BASE_URL)) { + this.setGitRepoBaseURL((String) additionalProperties.get(CodegenConstants.GIT_REPO_BASE_URL)); + } else { + additionalProperties.put(CodegenConstants.GIT_REPO_BASE_URL, gitRepoBaseURL); + } + if (additionalProperties.containsKey(CodegenConstants.ARTIFACT_VERSION)) { this.setArtifactVersion((String) additionalProperties.get(CodegenConstants.ARTIFACT_VERSION)); } else { diff --git a/src/main/resources/handlebars/php/README.mustache b/src/main/resources/handlebars/php/README.mustache index e7ecba0b9d..0dd35fa58e 100644 --- a/src/main/resources/handlebars/php/README.mustache +++ b/src/main/resources/handlebars/php/README.mustache @@ -31,7 +31,7 @@ To install the bindings via [Composer](http://getcomposer.org/), add the followi "repositories": [ { "type": "git", - "url": "https://github.com/{{#composerVendorName}}{{.}}{{/composerVendorName}}{{^composerVendorName}}{{gitUserId}}{{/composerVendorName}}/{{#composerProjectName}}{{.}}{{/composerProjectName}}{{^composerProjectName}}{{gitRepoId}}{{/composerProjectName}}.git" + "url": "http://{{gitRepoBaseURL}}.com/{{#composerVendorName}}{{.}}{{/composerVendorName}}{{^composerVendorName}}{{gitUserId}}{{/composerVendorName}}/{{#composerProjectName}}{{.}}{{/composerProjectName}}{{^composerProjectName}}{{gitRepoId}}{{/composerProjectName}}.git" } ], "require": { diff --git a/src/main/resources/handlebars/php/git_push.sh.mustache b/src/main/resources/handlebars/php/git_push.sh.mustache index f65b794638..dd518fc96d 100755 --- a/src/main/resources/handlebars/php/git_push.sh.mustache +++ b/src/main/resources/handlebars/php/git_push.sh.mustache @@ -37,9 +37,9 @@ if [ "$git_remote" = "" ]; then # git remote not defined if [ "$GIT_TOKEN" = "" ]; then echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." - git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git + git remote add origin https://${git_repo_base_url}.com/${git_user_id}/${git_repo_id}.git else - git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${git_user_id}/${git_repo_id}.git + git remote add origin https://${git_user_id}:${GIT_TOKEN}@${git_repo_base_url}.com/${git_user_id}/${git_repo_id}.git fi fi @@ -47,6 +47,6 @@ fi git pull origin master # Pushes (Forces) the changes in the local repository up to the remote repository -echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git" +echo "Git pushing to https://${git_repo_base_url}.com/${git_user_id}/${git_repo_id}.git" git push origin master 2>&1 | grep -v 'To https' From 01e126fe9e5706af6857ba677e3d4ce4d808fb54 Mon Sep 17 00:00:00 2001 From: frantuma Date: Thu, 30 Sep 2021 11:28:18 +0200 Subject: [PATCH 026/223] prepare release 1.0.28 --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 1c2286b80d..3c402f15a0 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.swagger.codegen.v3 swagger-codegen-generators - 1.0.28-SNAPSHOT + 1.0.28 jar @@ -252,9 +252,9 @@ - 3.0.28-SNAPSHOT - 2.0.27 - 2.1.10 + 3.0.28 + 2.0.28 + 2.1.11 2.12.1 2.11.1 3.3.0 From 6036a46d8b3d4cd4fc68ceaf1a355598c75a3f7f Mon Sep 17 00:00:00 2001 From: frantuma Date: Mon, 4 Oct 2021 16:56:06 +0200 Subject: [PATCH 027/223] next snapshot 1.0.29-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3c402f15a0..7ac61fe2c1 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.swagger.codegen.v3 swagger-codegen-generators - 1.0.28 + 1.0.29-SNAPSHOT jar From 080af54f57c8d050efea62dc53a6d0139f75074d Mon Sep 17 00:00:00 2001 From: frantuma Date: Mon, 4 Oct 2021 17:04:38 +0200 Subject: [PATCH 028/223] bump swagger-codegen to 3.0.29-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7ac61fe2c1..a4c3ddd83d 100644 --- a/pom.xml +++ b/pom.xml @@ -252,7 +252,7 @@ - 3.0.28 + 3.0.29-SNAPSHOT 2.0.28 2.1.11 2.12.1 From e440f5fb3865f4d41fe3e2960b4ef421de574ca5 Mon Sep 17 00:00:00 2001 From: frantuma Date: Tue, 5 Oct 2021 15:47:21 +0200 Subject: [PATCH 029/223] add jvm options to fix build in jdk16+ --- pom.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a4c3ddd83d..e140e0593a 100644 --- a/pom.xml +++ b/pom.xml @@ -66,10 +66,12 @@ maven-surefire-plugin - 2.22.0 + 2.22.2 -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit-version}/jmockit-${jmockit-version}.jar + -XX:+IgnoreUnrecognizedVMOptions + --add-opens=java.base/java.util=ALL-UNNAMED From d71637909c4970b5ccf41da613557b18017940c7 Mon Sep 17 00:00:00 2001 From: frantuma Date: Tue, 5 Oct 2021 19:34:29 +0200 Subject: [PATCH 030/223] fix typescript-angular regression for non-NPM --- .../typescript/TypeScriptAngularClientCodegen.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAngularClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAngularClientCodegen.java index b0b329a1cf..cdf4a63d2d 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAngularClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/typescript/TypeScriptAngularClientCodegen.java @@ -160,6 +160,15 @@ public void processOpts() { // Libraries generated with v2.x of ng-packagr will ship with AoT metadata in v4, which is intended for Angular v5 (and Angular v6). additionalProperties.put("useOldNgPackagr", !ngVersion.atLeast("5.0.0")); + // set http client usage + if (ngVersion.atLeast("8.0.0")) { + additionalProperties.put("useHttpClient", true); + } else if (ngVersion.atLeast("4.3.0")) { + additionalProperties.put("useHttpClient", true); + } else { + additionalProperties.put("useHttpClient", false); + } + if (additionalProperties.containsKey(PROVIDED_IN_ROOT) && !ngVersion.atLeast("6.0.0")) { additionalProperties.put(PROVIDED_IN_ROOT,false); } @@ -213,8 +222,6 @@ private void addNpmPackageGeneration(SemVer ngVersion) { this.setNpmRepository(additionalProperties.get(NPM_REPOSITORY).toString()); } - additionalProperties.put("useRxJS6", true); - additionalProperties.put("useHttpClient", true); additionalProperties.put("useHttpClientPackage", false); if (ngVersion.atLeast("11.0.0")) { additionalProperties.put("tsVersion", ">=4.0.0 <4.1.0"); @@ -263,7 +270,6 @@ private void addNpmPackageGeneration(SemVer ngVersion) { additionalProperties.put("tsickleVersion", "0.32.1"); additionalProperties.put("zonejsVersion", "0.8.26"); - additionalProperties.put("useRxJS6", false); additionalProperties.put("useHttpClientPackage", true); } From 7dc80676d8f5f632d850a25648d085debe4dbee3 Mon Sep 17 00:00:00 2001 From: frantuma Date: Tue, 5 Oct 2021 19:46:13 +0200 Subject: [PATCH 031/223] prepare release 1.0.29 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e140e0593a..fdc2e7727e 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.swagger.codegen.v3 swagger-codegen-generators - 1.0.29-SNAPSHOT + 1.0.29 jar @@ -254,7 +254,7 @@ - 3.0.29-SNAPSHOT + 3.0.29 2.0.28 2.1.11 2.12.1 From cf93f28ca171923236351f90e4562e8e39253745 Mon Sep 17 00:00:00 2001 From: frantuma Date: Fri, 8 Oct 2021 11:56:20 +0200 Subject: [PATCH 032/223] bump snapshot 1.0.30-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fdc2e7727e..9db1726866 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.swagger.codegen.v3 swagger-codegen-generators - 1.0.29 + 1.0.30-SNAPSHOT jar From f33775945295a3958fdeff2dc938e13299bc7b31 Mon Sep 17 00:00:00 2001 From: frantuma Date: Fri, 8 Oct 2021 12:02:03 +0200 Subject: [PATCH 033/223] bump swagger-codegen to 3.0.30-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9db1726866..e8119a0d89 100644 --- a/pom.xml +++ b/pom.xml @@ -254,7 +254,7 @@ - 3.0.29 + 3.0.30-SNAPSHOT 2.0.28 2.1.11 2.12.1 From 065a98cddb111015f25782f223eb159569220f68 Mon Sep 17 00:00:00 2001 From: Sergio Bilello Date: Wed, 15 Sep 2021 19:36:08 -0700 Subject: [PATCH 034/223] fix enum type generators template s f5aa34d8 revert version change s b2fdf56b wrap any value to a String on the JsonAdapter wrap any value to a String on the JsonAdapter --- src/main/resources/handlebars/Java/modelEnum.mustache | 6 +++--- src/main/resources/handlebars/Java/modelInnerEnum.mustache | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/handlebars/Java/modelEnum.mustache b/src/main/resources/handlebars/Java/modelEnum.mustache index 785ffb5ba9..cb304ec038 100644 --- a/src/main/resources/handlebars/Java/modelEnum.mustache +++ b/src/main/resources/handlebars/Java/modelEnum.mustache @@ -44,9 +44,9 @@ public enum {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum {{#jackson}} @JsonCreator {{/jackson}} - public static {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromValue(String text) { + public static {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromValue({{{dataType}}} input) { for ({{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) { - if (String.valueOf(b.value).equals(text)) { + if (b.value.equals(input)) { return b; } } @@ -57,7 +57,7 @@ public enum {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum public static class Adapter extends TypeAdapter<{{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}> { @Override public void write(final JsonWriter jsonWriter, final {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} enumeration) throws IOException { - jsonWriter.value(enumeration.getValue()); + jsonWriter.value(String.valueOf(enumeration.getValue())); } @Override diff --git a/src/main/resources/handlebars/Java/modelInnerEnum.mustache b/src/main/resources/handlebars/Java/modelInnerEnum.mustache index 544c92887e..849de22b06 100644 --- a/src/main/resources/handlebars/Java/modelInnerEnum.mustache +++ b/src/main/resources/handlebars/Java/modelInnerEnum.mustache @@ -28,9 +28,9 @@ {{#jackson}} @JsonCreator {{/jackson}} - public static {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromValue(String text) { + public static {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} fromValue({{{datatype}}} input) { for ({{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} b : {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.values()) { - if (String.valueOf(b.value).equals(text)) { + if (b.value.equals(input)) { return b; } } @@ -40,7 +40,7 @@ public static class Adapter extends TypeAdapter<{{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}> { @Override public void write(final JsonWriter jsonWriter, final {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}} enumeration) throws IOException { - jsonWriter.value(enumeration.getValue()); + jsonWriter.value(String.valueOf(enumeration.getValue())); } @Override From 88bf36e2e7043c3e4093b24f044c376629ce90b0 Mon Sep 17 00:00:00 2001 From: Sergio Bilello Date: Fri, 15 Oct 2021 00:47:14 -0700 Subject: [PATCH 035/223] fix missing type cast on read for serialization --- src/main/resources/handlebars/Java/modelEnum.mustache | 2 +- src/main/resources/handlebars/Java/modelInnerEnum.mustache | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/handlebars/Java/modelEnum.mustache b/src/main/resources/handlebars/Java/modelEnum.mustache index cb304ec038..b85cf1e86b 100644 --- a/src/main/resources/handlebars/Java/modelEnum.mustache +++ b/src/main/resources/handlebars/Java/modelEnum.mustache @@ -63,7 +63,7 @@ public enum {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum @Override public {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} read(final JsonReader jsonReader) throws IOException { Object value = {{#isNumber}}new BigDecimal(jsonReader.nextDouble()){{/isNumber}}{{^isNumber}}jsonReader.{{#isInteger}}nextInt(){{/isInteger}}{{^isInteger}}nextString(){{/isInteger}}{{/isNumber}}; - return {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.fromValue(String.valueOf(value)); + return {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.fromValue(({{{datatype}}})(value)); } } {{/if}} diff --git a/src/main/resources/handlebars/Java/modelInnerEnum.mustache b/src/main/resources/handlebars/Java/modelInnerEnum.mustache index 849de22b06..eac2bb57bb 100644 --- a/src/main/resources/handlebars/Java/modelInnerEnum.mustache +++ b/src/main/resources/handlebars/Java/modelInnerEnum.mustache @@ -46,7 +46,7 @@ @Override public {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}} read(final JsonReader jsonReader) throws IOException { Object value = {{#isNumber}}new BigDecimal(jsonReader.nextDouble()){{/isNumber}}{{^isNumber}}jsonReader.{{#isInteger}}nextInt(){{/isInteger}}{{^isInteger}}nextString(){{/isInteger}}{{/isNumber}}; - return {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}.fromValue(String.valueOf(value)); + return {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{classname}}{{/datatypeWithEnum}}.fromValue(({{{datatype}}})(value)); } }{{/gson}} } \ No newline at end of file From ed1347fe7a1d28a2244e9c890605336e9a530804 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Wed, 27 Oct 2021 08:26:58 -0500 Subject: [PATCH 036/223] fixed html summary escape in operations --- src/main/resources/handlebars/htmlDocs/index.mustache | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/handlebars/htmlDocs/index.mustache b/src/main/resources/handlebars/htmlDocs/index.mustache index 42803c1435..6d2c20019f 100644 --- a/src/main/resources/handlebars/htmlDocs/index.mustache +++ b/src/main/resources/handlebars/htmlDocs/index.mustache @@ -52,9 +52,9 @@

Up
{{httpMethod}} {{path}}
-
{{summary}} ({{nickname}})
+
{{{summary}}} ({{nickname}})
{{! notes is operation.description. So why rename it and make it super confusing???? }} -
{{notes}}
+
{{{notes}}}
{{#hasPathParams}}

Path parameters

From d71bcde264d80118da50d22122ed82a9c1cc9047 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Thu, 28 Oct 2021 17:03:18 -0500 Subject: [PATCH 037/223] added wiremock option for test and updated templates. --- .../v3/generators/java/JavaClientCodegen.java | 9 ++++ .../handlebars/Java/api_test.mustache | 43 +++++++++++++++++-- .../Java/libraries/feign/api_test.mustache | 34 +++++++++++++++ .../Java/libraries/feign/pom.mustache | 8 ++++ .../Java/libraries/jersey2/pom.mustache | 8 ++++ .../Java/libraries/okhttp-gson/pom.mustache | 8 ++++ .../Java/libraries/resteasy/pom.mustache | 8 ++++ .../Java/libraries/resttemplate/pom.mustache | 8 ++++ .../Java/libraries/retrofit/api_test.mustache | 37 ++++++++++++++++ .../Java/libraries/retrofit/pom.mustache | 8 ++++ .../libraries/retrofit2/api_test.mustache | 37 ++++++++++++++++ .../Java/libraries/retrofit2/pom.mustache | 8 ++++ .../resources/handlebars/Java/pom.mustache | 8 ++++ 13 files changed, 221 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java index 2c0dbd7a0a..65d80cd3d1 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java @@ -53,6 +53,8 @@ public class JavaClientCodegen extends AbstractJavaCodegen implements BeanValida public static final String RETROFIT_1 = "retrofit"; public static final String RETROFIT_2 = "retrofit2"; + public static final String WIREMOCK_OPTION = "wiremock"; + protected String gradleWrapperPackage = "gradle.wrapper"; protected boolean useRxJava = false; protected boolean useRxJava2 = false; @@ -87,6 +89,8 @@ public JavaClientCodegen() { cliOptions.add(CliOption.newBoolean(USE_GZIP_FEATURE, "Send gzip-encoded requests")); cliOptions.add(CliOption.newBoolean(USE_RUNTIME_EXCEPTION, "Use RuntimeException instead of Exception")); + cliOptions.add(CliOption.newBoolean(WIREMOCK_OPTION, "Use wiremock to generate endpoint calls to mock on generated tests.")); + supportedLibraries.put("jersey1", "HTTP client: Jersey client 1.19.4. JSON processing: Jackson 2.10.1. Enable gzip request encoding using '-DuseGzipFeature=true'."); supportedLibraries.put("feign", "HTTP client: OpenFeign 9.4.0. JSON processing: Jackson 2.10.1"); supportedLibraries.put("jersey2", "HTTP client: Jersey client 2.26. JSON processing: Jackson 2.10.1"); @@ -169,6 +173,11 @@ public void processOpts() { this.setUseRuntimeException(convertPropertyToBooleanAndWriteBack(USE_RUNTIME_EXCEPTION)); } + if (additionalProperties.containsKey(WIREMOCK_OPTION)) { + final boolean useWireMock = additionalProperties.get(WIREMOCK_OPTION) != null && Boolean.parseBoolean(additionalProperties.get(WIREMOCK_OPTION).toString()); + additionalProperties.put(WIREMOCK_OPTION, useWireMock); + } + final String invokerFolder = (sourceFolder + File.separator + invokerPackage).replace(".", File.separator); final String authFolder = (sourceFolder + File.separator + invokerPackage + ".auth").replace(".", File.separator); final String apiFolder = (sourceFolder + File.separator + apiPackage).replace(".", File.separator); diff --git a/src/main/resources/handlebars/Java/api_test.mustache b/src/main/resources/handlebars/Java/api_test.mustache index c9a25efeef..8c13fe4577 100644 --- a/src/main/resources/handlebars/Java/api_test.mustache +++ b/src/main/resources/handlebars/Java/api_test.mustache @@ -2,12 +2,19 @@ package {{package}}; -import {{invokerPackage}}.ApiException; {{#imports}}import {{import}}; {{/imports}} import org.junit.Test; import org.junit.Ignore; +{{#wiremock}} +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.core.WireMockConfiguration; +import java.net.HttpURLConnection; +import org.junit.AfterClass; +import org.junit.BeforeClass; +{{/wiremock}} + {{^fullJavaUtil}} import java.util.ArrayList; import java.util.HashMap; @@ -15,6 +22,10 @@ import java.util.List; import java.util.Map; {{/fullJavaUtil}} +{{#wiremock}} +import static com.github.tomakehurst.wiremock.client.WireMock.*; +{{/wiremock}} + /** * API tests for {{classname}} */ @@ -22,6 +33,32 @@ import java.util.Map; public class {{classname}}Test { private final {{classname}} api = new {{classname}}(); + {{#wiremock}} + private static WireMockServer wireMockServer; + + public {{classname}}Test() { + api.getApiClient().setBasePath("http://localhost:" + wireMockServer.port()); + } + + @BeforeClass + public static void setUp() { + wireMockServer = new WireMockServer(WireMockConfiguration.wireMockConfig().dynamicPort()); + wireMockServer.start(); + configureFor(wireMockServer.port()); + {{#operations}} + {{#operation}} + stubFor({{toLowerCase httpMethod}}(urlPathMatching("{{{path}}}")) + .willReturn(aResponse() + .withStatus(HttpURLConnection.HTTP_OK))); + {{/operation}} + {{/operations}} + } + + @AfterClass + public static void tearDown() { + wireMockServer.stop(); + } + {{/wiremock}} {{#operations}} {{#operation}} @@ -32,11 +69,11 @@ public class {{classname}}Test { * * {{notes}} * - * @throws ApiException + * @throws Exception * if the Api call fails */ @Test - public void {{operationId}}Test() throws ApiException { + public void {{operationId}}Test() throws Exception { {{#parameters}} {{{dataType}}} {{paramName}} = null; {{/parameters}} diff --git a/src/main/resources/handlebars/Java/libraries/feign/api_test.mustache b/src/main/resources/handlebars/Java/libraries/feign/api_test.mustache index 7423032672..6317437e47 100644 --- a/src/main/resources/handlebars/Java/libraries/feign/api_test.mustache +++ b/src/main/resources/handlebars/Java/libraries/feign/api_test.mustache @@ -6,6 +6,13 @@ import {{invokerPackage}}.ApiClient; import org.junit.Before; import org.junit.Test; +{{#wiremock}} +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.core.WireMockConfiguration; +import java.net.HttpURLConnection; +import org.junit.AfterClass; +{{/wiremock}} + {{^fullJavaUtil}} import java.util.ArrayList; import java.util.HashMap; @@ -13,6 +20,10 @@ import java.util.List; import java.util.Map; {{/fullJavaUtil}} +{{#wiremock}} +import static com.github.tomakehurst.wiremock.client.WireMock.*; +{{/wiremock}} + /** * API tests for {{classname}} */ @@ -20,10 +31,33 @@ public class {{classname}}Test { private {{classname}} api; + {{#wiremock}} + private static WireMockServer wireMockServer; + + @Before + public void setup() { + wireMockServer = new WireMockServer(WireMockConfiguration.wireMockConfig().dynamicPort()); + wireMockServer.start(); + configureFor(wireMockServer.port()); + api = new ApiClient().setBasePath("http://localhost:" + wireMockServer.port()).buildClient({{classname}}.class); + {{#operations}}{{#operation}} + stubFor({{toLowerCase httpMethod}}(urlPathMatching("{{{path}}}")) + .willReturn(aResponse() + .withStatus(HttpURLConnection.HTTP_OK))); + {{/operation}}{{/operations}} + } + + @AfterClass + public static void tearDown() { + wireMockServer.stop(); + } + {{/wiremock}} + {{^wiremock}} @Before public void setup() { api = new ApiClient().buildClient({{classname}}.class); } + {{/wiremock}} {{#operations}}{{#operation}}{{#contents}}{{#@first}} /** diff --git a/src/main/resources/handlebars/Java/libraries/feign/pom.mustache b/src/main/resources/handlebars/Java/libraries/feign/pom.mustache index ce23b76f21..458201856c 100644 --- a/src/main/resources/handlebars/Java/libraries/feign/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/feign/pom.mustache @@ -293,6 +293,14 @@ 1.7.1 test + {{#wiremock}} + + com.github.tomakehurst + wiremock + 2.27.2 + test + + {{/wiremock}} {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} diff --git a/src/main/resources/handlebars/Java/libraries/jersey2/pom.mustache b/src/main/resources/handlebars/Java/libraries/jersey2/pom.mustache index f42c1f434a..78e13ab279 100644 --- a/src/main/resources/handlebars/Java/libraries/jersey2/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/jersey2/pom.mustache @@ -303,6 +303,14 @@ ${junit-version} test + {{#wiremock}} + + com.github.tomakehurst + wiremock + 2.27.2 + test + + {{/wiremock}} {{#useOas2}} diff --git a/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache b/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache index 356b0d76c2..13230dea51 100644 --- a/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache @@ -290,6 +290,14 @@ ${junit-version} test + {{#wiremock}} + + com.github.tomakehurst + wiremock + 2.27.2 + test + + {{/wiremock}} {{#java11}}11{{/java11}}{{^java11}}{{#java8}}1.8{{/java8}}{{^java8}}1.7{{/java8}}{{/java11}} diff --git a/src/main/resources/handlebars/Java/libraries/resteasy/pom.mustache b/src/main/resources/handlebars/Java/libraries/resteasy/pom.mustache index f8dcf77470..8e2bb643f2 100644 --- a/src/main/resources/handlebars/Java/libraries/resteasy/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/resteasy/pom.mustache @@ -231,6 +231,14 @@ ${junit-version} test + {{#wiremock}} + + com.github.tomakehurst + wiremock + 2.27.2 + test + + {{/wiremock}} {{#useOas2}} diff --git a/src/main/resources/handlebars/Java/libraries/resttemplate/pom.mustache b/src/main/resources/handlebars/Java/libraries/resttemplate/pom.mustache index df731f2dbd..2edc1856c9 100644 --- a/src/main/resources/handlebars/Java/libraries/resttemplate/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/resttemplate/pom.mustache @@ -287,6 +287,14 @@ ${junit-version} test + {{#wiremock}} + + com.github.tomakehurst + wiremock + 2.27.2 + test + + {{/wiremock}} UTF-8 diff --git a/src/main/resources/handlebars/Java/libraries/retrofit/api_test.mustache b/src/main/resources/handlebars/Java/libraries/retrofit/api_test.mustache index ac191b73e4..34e47634d4 100644 --- a/src/main/resources/handlebars/Java/libraries/retrofit/api_test.mustache +++ b/src/main/resources/handlebars/Java/libraries/retrofit/api_test.mustache @@ -6,6 +6,13 @@ import {{invokerPackage}}.ApiClient; import org.junit.Before; import org.junit.Test; +{{#wiremock}} +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.core.WireMockConfiguration; +import java.net.HttpURLConnection; +import org.junit.AfterClass; +{{/wiremock}} + {{^fullJavaUtil}} import java.util.ArrayList; import java.util.HashMap; @@ -13,6 +20,10 @@ import java.util.List; import java.util.Map; {{/fullJavaUtil}} +{{#wiremock}} +import static com.github.tomakehurst.wiremock.client.WireMock.*; +{{/wiremock}} + /** * API tests for {{classname}} */ @@ -20,10 +31,36 @@ public class {{classname}}Test { private {{classname}} api; + {{#wiremock}} + private static WireMockServer wireMockServer; + + @Before + public void setup() { + wireMockServer = new WireMockServer(WireMockConfiguration.wireMockConfig().dynamicPort()); + wireMockServer.start(); + configureFor(wireMockServer.port()); + ApiClient apiClient = new ApiClient(); + apiClient.getAdapterBuilder().setEndpoint("http://localhost:" + wireMockServer.port()); + api = apiClient.createService({{classname}}.class); + + {{#operations}}{{#operation}} + stubFor({{toLowerCase httpMethod}}(urlPathMatching("{{{path}}}")) + .willReturn(aResponse() + .withStatus(HttpURLConnection.HTTP_OK))); + {{/operation}}{{/operations}} + } + + @AfterClass + public static void tearDown() { + wireMockServer.stop(); + } + {{/wiremock}} + {{^wiremock}} @Before public void setup() { api = new ApiClient().createService({{classname}}.class); } + {{/wiremock}} {{#operations}}{{#operation}}{{#contents}}{{#@first}} /** diff --git a/src/main/resources/handlebars/Java/libraries/retrofit/pom.mustache b/src/main/resources/handlebars/Java/libraries/retrofit/pom.mustache index dadf9a22c5..5673a3aacb 100644 --- a/src/main/resources/handlebars/Java/libraries/retrofit/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/retrofit/pom.mustache @@ -245,6 +245,14 @@ ${junit-version} test + {{#wiremock}} + + com.github.tomakehurst + wiremock + 2.27.2 + test + + {{/wiremock}} {{#useOas2}} diff --git a/src/main/resources/handlebars/Java/libraries/retrofit2/api_test.mustache b/src/main/resources/handlebars/Java/libraries/retrofit2/api_test.mustache index 7c4e8e21ce..ed169f5614 100644 --- a/src/main/resources/handlebars/Java/libraries/retrofit2/api_test.mustache +++ b/src/main/resources/handlebars/Java/libraries/retrofit2/api_test.mustache @@ -6,6 +6,13 @@ import {{invokerPackage}}.ApiClient; import org.junit.Before; import org.junit.Test; +{{#wiremock}} +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.core.WireMockConfiguration; +import java.net.HttpURLConnection; +import org.junit.AfterClass; +{{/wiremock}} + {{^fullJavaUtil}} import java.util.ArrayList; import java.util.HashMap; @@ -13,6 +20,10 @@ import java.util.List; import java.util.Map; {{/fullJavaUtil}} +{{#wiremock}} +import static com.github.tomakehurst.wiremock.client.WireMock.*; +{{/wiremock}} + /** * API tests for {{classname}} */ @@ -20,10 +31,36 @@ public class {{classname}}Test { private {{classname}} api; + {{#wiremock}} + private static WireMockServer wireMockServer; + + @Before + public void setup() { + wireMockServer = new WireMockServer(WireMockConfiguration.wireMockConfig().dynamicPort()); + wireMockServer.start(); + configureFor(wireMockServer.port()); + ApiClient apiClient = new ApiClient(); + apiClient.getAdapterBuilder().setEndpoint("http://localhost:" + wireMockServer.port()); + api = apiClient.createService({{classname}}.class); + + {{#operations}}{{#operation}} + stubFor({{toLowerCase httpMethod}}(urlPathMatching("{{{path}}}")) + .willReturn(aResponse() + .withStatus(HttpURLConnection.HTTP_OK))); + {{/operation}}{{/operations}} + } + + @AfterClass + public static void tearDown() { + wireMockServer.stop(); + } + {{/wiremock}} + {{^wiremock}} @Before public void setup() { api = new ApiClient().createService({{classname}}.class); } + {{/wiremock}} {{#operations}} {{#operation}} diff --git a/src/main/resources/handlebars/Java/libraries/retrofit2/pom.mustache b/src/main/resources/handlebars/Java/libraries/retrofit2/pom.mustache index fc60a4f0f0..cfb0780585 100644 --- a/src/main/resources/handlebars/Java/libraries/retrofit2/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/retrofit2/pom.mustache @@ -336,6 +336,14 @@ ${junit-version} test + {{#wiremock}} + + com.github.tomakehurst + wiremock + 2.27.2 + test + + {{/wiremock}} UTF-8 diff --git a/src/main/resources/handlebars/Java/pom.mustache b/src/main/resources/handlebars/Java/pom.mustache index abc6c554d2..3eeb3fa208 100644 --- a/src/main/resources/handlebars/Java/pom.mustache +++ b/src/main/resources/handlebars/Java/pom.mustache @@ -324,6 +324,14 @@ ${junit-version} test + {{#wiremock}} + + com.github.tomakehurst + wiremock + 2.27.2 + test + + {{/wiremock}} UTF-8 From 7f8a6e8f2ce9fb6a077cb94a130b38e7179b0c97 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Thu, 28 Oct 2021 17:20:44 -0500 Subject: [PATCH 038/223] set joda as default library for retrofit --- .../swagger/codegen/v3/generators/java/JavaClientCodegen.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java index 65d80cd3d1..702d88ed41 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java @@ -126,6 +126,10 @@ public String getHelp() { @Override public void processOpts() { + if (RETROFIT_1.equalsIgnoreCase(library)) { + dateLibrary = "joda"; + } + super.processOpts(); if (additionalProperties.containsKey(USE_RX_JAVA)) { From 43699b8ce6eddbaf93dc32da53f94d4d35ff82a4 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Wed, 3 Nov 2021 00:43:07 -0500 Subject: [PATCH 039/223] added build gradle for java 11 template files --- .../v3/generators/java/JavaClientCodegen.java | 6 +- .../Java/build.gradle.java11.mustache | 76 ++++++++++++ .../feign/build.gradle.java11.mustache | 87 +++++++++++++ .../jersey2/build.gradle.java11.mustache | 78 ++++++++++++ .../okhttp-gson/build.gradle.java11.mustache | 65 ++++++++++ .../resttemplate/build.gradle.java11.mustache | 81 +++++++++++++ .../retrofit/build.gradle.java11.mustache | 68 +++++++++++ .../retrofit2/build.gradle.java11.mustache | 114 ++++++++++++++++++ 8 files changed, 574 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/handlebars/Java/build.gradle.java11.mustache create mode 100644 src/main/resources/handlebars/Java/libraries/feign/build.gradle.java11.mustache create mode 100644 src/main/resources/handlebars/Java/libraries/jersey2/build.gradle.java11.mustache create mode 100644 src/main/resources/handlebars/Java/libraries/okhttp-gson/build.gradle.java11.mustache create mode 100644 src/main/resources/handlebars/Java/libraries/resttemplate/build.gradle.java11.mustache create mode 100644 src/main/resources/handlebars/Java/libraries/retrofit/build.gradle.java11.mustache create mode 100644 src/main/resources/handlebars/Java/libraries/retrofit2/build.gradle.java11.mustache diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java index 702d88ed41..c08cbf43ed 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java @@ -189,7 +189,11 @@ public void processOpts() { //Common files writeOptional(outputFolder, new SupportingFile("pom.mustache", "", "pom.xml")); writeOptional(outputFolder, new SupportingFile("README.mustache", "", "README.md")); - writeOptional(outputFolder, new SupportingFile("build.gradle.mustache", "", "build.gradle")); + if (java11Mode) { + writeOptional(outputFolder, new SupportingFile("build.gradle.java11.mustache", "", "build.gradle")); + } else { + writeOptional(outputFolder, new SupportingFile("build.gradle.mustache", "", "build.gradle")); + } writeOptional(outputFolder, new SupportingFile("build.sbt.mustache", "", "build.sbt")); writeOptional(outputFolder, new SupportingFile("settings.gradle.mustache", "", "settings.gradle")); writeOptional(outputFolder, new SupportingFile("gradle.properties.mustache", "", "gradle.properties")); diff --git a/src/main/resources/handlebars/Java/build.gradle.java11.mustache b/src/main/resources/handlebars/Java/build.gradle.java11.mustache new file mode 100644 index 0000000000..5e7621a111 --- /dev/null +++ b/src/main/resources/handlebars/Java/build.gradle.java11.mustache @@ -0,0 +1,76 @@ +plugins { + id 'java' + id 'maven-publish' +} + +repositories { + mavenLocal() + maven { + url = uri('https://repo.maven.apache.org/maven2/') + } +} + +ext { + swagger_annotations_version = "{{#useOas2}}1.5.24{{/useOas2}}{{^useOas2}}2.0.0{{/useOas2}}" + jackson_version = "{{^threetenbp}}2.11.4{{/threetenbp}}{{#threetenbp}}2.6.4{{/threetenbp}}" + jersey_version = "1.19.4" + jodatime_version = "2.10.5" + junit_version = "4.13.1" +} + +dependencies { + {{#useOas2}} + implementation "io.swagger:swagger-annotations:$swagger_annotations_version" + {{/useOas2}} + {{^useOas2}} + implementation "io.swagger.core.v3:swagger-annotations:$swagger_annotations_version" + {{/useOas2}} + implementation "com.sun.jersey:jersey-client:$jersey_version" + implementation "com.sun.jersey.contribs:jersey-multipart:$jersey_version" + implementation "com.fasterxml.jackson.core:jackson-core:$jackson_version" + implementation "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" + implementation "com.fasterxml.jackson.core:jackson-databind:$jackson_version" + implementation "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:$jackson_version" + {{#joda}} + implementation "com.fasterxml.jackson.datatype:jackson-datatype-joda:$jackson_version" + {{/joda}} + implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jackson_version"} + {{#threetenbp}} + implementation "com.github.joschi.jackson:jackson-datatype-threetenbp:$jackson_version" + {{/threetenbp}} + implementation 'com.sun.xml.ws:jaxws-rt:2.3.3' + testImplementation "junit:junit:$junit_version" + {{#wiremock}} + testImplementation "com.github.tomakehurst:wiremock:2.27.2" + {{/wiremock}} +} + +group = '{{groupId}}' +version = '{{artifactVersion}}' +description = '{{artifactDescription}}' + +java.sourceCompatibility = 11 +java.targetCompatibility = 11 + +tasks.register('testsJar', Jar) { + archiveClassifier = 'tests' + from(sourceSets.test.output) +} + +java { + withSourcesJar() + withJavadocJar() +} + +publishing { + publications { + maven(MavenPublication) { + from(components.java) + artifact(testsJar) + } + } +} + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} \ No newline at end of file diff --git a/src/main/resources/handlebars/Java/libraries/feign/build.gradle.java11.mustache b/src/main/resources/handlebars/Java/libraries/feign/build.gradle.java11.mustache new file mode 100644 index 0000000000..21cc55b2a6 --- /dev/null +++ b/src/main/resources/handlebars/Java/libraries/feign/build.gradle.java11.mustache @@ -0,0 +1,87 @@ +plugins { + id 'java' + id 'maven-publish' +} + +repositories { + mavenLocal() + maven { + url = uri('https://repo.maven.apache.org/maven2/') + } +} + +ext { + swagger_annotations_version = "{{#useOas2}}1.5.24{{/useOas2}}{{^useOas2}}2.0.0{{/useOas2}}" + jackson_version = "2.11.4" + {{#threetenbp}} + threepane_version = "2.6.4" + {{/threetenbp}} + feign_version = "11.6" + feign_form_version = "3.8.0" + junit_version = "4.13.1" + oltu_version = "1.0.2" +} + +dependencies { + {{#useOas2}} + implementation "io.swagger:swagger-annotations:$swagger_annotations_version" + {{/useOas2}} + {{^useOas2}} + implementation "io.swagger.core.v3:swagger-annotations:$swagger_annotations_version" + {{/useOas2}} + implementation "io.github.openfeign:feign-core:$feign_version" + implementation "io.github.openfeign:feign-jackson:$feign_version" + implementation "io.github.openfeign:feign-slf4j:$feign_version" + implementation "io.github.openfeign.form:feign-form:$feign_form_version" + implementation "com.fasterxml.jackson.core:jackson-core:$jackson_version" + implementation "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" + implementation "com.fasterxml.jackson.core:jackson-databind:$jackson_version" + {{#joda}} + implementation "com.fasterxml.jackson.datatype:jackson-datatype-joda:$jackson_version" + {{/joda}} + {{#java8}} + implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jackson_version" + {{/java8}} + {{#threetenbp}} + implementation "com.github.joschi.jackson:jackson-datatype-threetenbp:$threepane_version" + {{/threetenbp}} + implementation "org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:$oltu_version" + implementation "com.brsanthu:migbase64:2.2" + implementation "com.sun.xml.ws:jaxws-rt:2.3.3" + testImplementation "junit:junit:$junit_version" + testImplementation "com.squareup.okhttp3:mockwebserver:3.6.0" + testImplementation "org.assertj:assertj-core:1.7.1" + {{#wiremock}} + testImplementation "com.github.tomakehurst:wiremock:2.27.2" + {{/wiremock}} +} + +group = '{{groupId}}' +version = '{{artifactVersion}}' +description = '{{artifactDescription}}' + +java.sourceCompatibility = 11 +java.targetCompatibility = 11 + +tasks.register('testsJar', Jar) { + archiveClassifier = 'tests' + from(sourceSets.test.output) +} + +java { + withSourcesJar() + withJavadocJar() +} + +publishing { + publications { + maven(MavenPublication) { + from(components.java) + artifact(testsJar) + } + } +} + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} \ No newline at end of file diff --git a/src/main/resources/handlebars/Java/libraries/jersey2/build.gradle.java11.mustache b/src/main/resources/handlebars/Java/libraries/jersey2/build.gradle.java11.mustache new file mode 100644 index 0000000000..dd7a6aeda1 --- /dev/null +++ b/src/main/resources/handlebars/Java/libraries/jersey2/build.gradle.java11.mustache @@ -0,0 +1,78 @@ +plugins { + id 'java' + id 'maven-publish' +} + +repositories { + mavenLocal() + maven { + url = uri('https://repo.maven.apache.org/maven2/') + } +} + +ext { + swagger_annotations_version = "{{#useOas2}}1.5.24{{/useOas2}}{{^useOas2}}2.0.0{{/useOas2}}" + jackson_version = "2.6.4" + jersey_version = "2.29.1" + junit_version = "4.13.1" +} + +dependencies { + {{#useOas2}} + implementation "io.swagger:swagger-annotations:$swagger_annotations_version" + {{/useOas2}} + {{^useOas2}} + implementation "io.swagger.core.v3:swagger-annotations:$swagger_annotations_version" + {{/useOas2}} + implementation "org.glassfish.jersey.core:jersey-client:$jersey_version" + implementation "org.glassfish.jersey.media:jersey-media-multipart:$jersey_version" + implementation "org.glassfish.jersey.media:jersey-media-json-jackson:$jersey_version" + implementation "com.fasterxml.jackson.core:jackson-core:$jackson_version" + implementation "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" + implementation "com.fasterxml.jackson.core:jackson-databind:$jackson_version" + {{#withXml}} + implementation "org.glassfish.jersey.media:jersey-media-jaxb:$jersey_version" + {{/withXml}} + {{#joda}} + implementation "com.fasterxml.jackson.datatype:jackson-datatype-joda:$jackson_version" + {{/joda}} + implementation "org.glassfish.jersey.inject:jersey-hk2:$jersey_version" + {{#threetenbp}} + implementation "com.github.joschi.jackson:jackson-datatype-threetenbp:$jackson_version" + {{/threetenbp}} + implementation "com.brsanthu:migbase64:2.2" + testImplementation "junit:junit:$junit_version" + {{#wiremock}} + testImplementation "com.github.tomakehurst:wiremock:2.27.2" + {{/wiremock}} +} + +group = '{{groupId}}' +version = '{{artifactVersion}}' +description = '{{artifactDescription}}' + +java.sourceCompatibility = 11 +java.targetCompatibility = 11 + +tasks.register('testsJar', Jar) { + archiveClassifier = 'tests' + from(sourceSets.test.output) +} + +java { + withSourcesJar() + withJavadocJar() +} + +publishing { + publications { + maven(MavenPublication) { + from(components.java) + artifact(testsJar) + } + } +} + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} diff --git a/src/main/resources/handlebars/Java/libraries/okhttp-gson/build.gradle.java11.mustache b/src/main/resources/handlebars/Java/libraries/okhttp-gson/build.gradle.java11.mustache new file mode 100644 index 0000000000..3d98e49209 --- /dev/null +++ b/src/main/resources/handlebars/Java/libraries/okhttp-gson/build.gradle.java11.mustache @@ -0,0 +1,65 @@ +plugins { + id 'java' + id 'maven-publish' +} + +repositories { + mavenLocal() + maven { + url = uri('https://repo.maven.apache.org/maven2/') + } +} + +dependencies { + {{#useOas2}} + implementation 'io.swagger:swagger-annotations:1.5.24' + {{/useOas2}} + {{^useOas2}} + implementation "io.swagger.core.v3:swagger-annotations:2.0.0" + {{/useOas2}} + implementation 'com.squareup.okhttp:okhttp:2.7.5' + implementation 'com.squareup.okhttp:logging-interceptor:2.7.5' + implementation 'com.google.code.gson:gson:2.8.1' + implementation 'io.gsonfire:gson-fire:1.8.0' + {{#joda}} + implementation 'joda-time:joda-time:2.9.9' + {{/joda}} + {{#threetenbp}} + implementation 'org.threeten:threetenbp:1.3.5' + {{/threetenbp}} + implementation 'com.sun.xml.ws:jaxws-rt:2.3.3' + testImplementation 'junit:junit:4.13.1' + {{#wiremock}} + testImplementation "com.github.tomakehurst:wiremock:2.27.2" + {{/wiremock}} +} + +group = '{{groupId}}' +version = '{{artifactVersion}}' +description = '{{artifactDescription}}' + +java.sourceCompatibility = 11 +java.targetCompatibility = 11 + +tasks.register('testsJar', Jar) { + archiveClassifier = 'tests' + from(sourceSets.test.output) +} + +java { + withSourcesJar() + withJavadocJar() +} + +publishing { + publications { + maven(MavenPublication) { + from(components.java) + artifact(testsJar) + } + } +} + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} diff --git a/src/main/resources/handlebars/Java/libraries/resttemplate/build.gradle.java11.mustache b/src/main/resources/handlebars/Java/libraries/resttemplate/build.gradle.java11.mustache new file mode 100644 index 0000000000..d78adeb215 --- /dev/null +++ b/src/main/resources/handlebars/Java/libraries/resttemplate/build.gradle.java11.mustache @@ -0,0 +1,81 @@ +plugins { + id 'java' + id 'maven-publish' +} + +repositories { + mavenLocal() + maven { + url = uri('https://repo.maven.apache.org/maven2/') + } +} + +ext { + swagger_annotations_version = "{{#useOas2}}1.5.24{{/useOas2}}{{^useOas2}}2.0.0{{/useOas2}}" + jackson_version = "2.11.4" + spring_web_version = "4.3.9.RELEASE" + jodatime_version = "2.10.5" + junit_version = "4.12" + {{#threetenbp}} + jackson_threeten_version = "2.6.4" + {{/threetenbp}} +} + +dependencies { + {{#useOas2}} + implementation "io.swagger:swagger-annotations:$swagger_annotations_version" + {{/useOas2}} + {{^useOas2}} + implementation "io.swagger.core.v3:swagger-annotations:$swagger_annotations_version" + {{/useOas2}} + implementation "org.springframework:spring-web:$spring_web_version" + implementation "com.fasterxml.jackson.core:jackson-core:$jackson_version" + implementation "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" + implementation "com.fasterxml.jackson.core:jackson-databind:$jackson_version" + implementation "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:$jackson_version" + {{#joda}} + implementation "com.fasterxml.jackson.datatype:jackson-datatype-joda:$jackson_version" + implementation "joda-time:joda-time:$jodatime_version" + {{/joda}} + {{#threetenbp}} + implementation "com.github.joschi.jackson:jackson-datatype-threetenbp:$jackson_threeten_version" + {{/threetenbp}} + {{#withXml}} + implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:$jackson_version" + {{/withXml}} + implementation "com.sun.xml.ws:jaxws-rt:2.3.3" + testImplementation "junit:junit:$junit_version" + {{#wiremock}} + testImplementation "com.github.tomakehurst:wiremock:2.27.2" + {{/wiremock}} +} + +group = '{{groupId}}' +version = '{{artifactVersion}}' +description = '{{artifactDescription}}' + +java.sourceCompatibility = 11 +java.targetCompatibility = 11 + +tasks.register('testsJar', Jar) { + archiveClassifier = 'tests' + from(sourceSets.test.output) +} + +java { + withSourcesJar() + withJavadocJar() +} + +publishing { + publications { + maven(MavenPublication) { + from(components.java) + artifact(testsJar) + } + } +} + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} \ No newline at end of file diff --git a/src/main/resources/handlebars/Java/libraries/retrofit/build.gradle.java11.mustache b/src/main/resources/handlebars/Java/libraries/retrofit/build.gradle.java11.mustache new file mode 100644 index 0000000000..3fe5d7a5dd --- /dev/null +++ b/src/main/resources/handlebars/Java/libraries/retrofit/build.gradle.java11.mustache @@ -0,0 +1,68 @@ +plugins { + id 'java' + id 'maven-publish' +} + +repositories { + mavenLocal() + maven { + url = uri('https://repo.maven.apache.org/maven2/') + } +} + +ext { + okhttp_version = "2.7.5" + oltu_version = "1.0.2" + retrofit_version = "1.9.0" + swagger_annotations_version = "{{#useOas2}}1.5.24{{/useOas2}}{{^useOas2}}2.0.0{{/useOas2}}" + junit_version = "4.13.1" + jodatime_version = "2.10.5" +} + +dependencies { + implementation "com.squareup.okhttp:okhttp:$okhttp_version" + implementation "com.squareup.retrofit:retrofit:$retrofit_version" + {{#useOas2}} + implementation "io.swagger:swagger-annotations:$swagger_annotations_version" + {{/useOas2}} + {{^useOas2}} + implementation "io.swagger.core.v3:swagger-annotations:$swagger_annotations_version" + {{/useOas2}} + implementation "org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:$oltu_version" + implementation "joda-time:joda-time:$jodatime_version" + implementation "com.sun.xml.ws:jaxws-rt:2.3.3" + testImplementation "junit:junit:$junit_version" + {{#wiremock}} + testImplementation "com.github.tomakehurst:wiremock:2.27.2" + {{/wiremock}} +} + +group = '{{groupId}}' +version = '{{artifactVersion}}' +description = '{{artifactDescription}}' + +java.sourceCompatibility = 11 +java.targetCompatibility = 11 + +tasks.register('testsJar', Jar) { + archiveClassifier = 'tests' + from(sourceSets.test.output) +} + +java { + withSourcesJar() + withJavadocJar() +} + +publishing { + publications { + maven(MavenPublication) { + from(components.java) + artifact(testsJar) + } + } +} + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} diff --git a/src/main/resources/handlebars/Java/libraries/retrofit2/build.gradle.java11.mustache b/src/main/resources/handlebars/Java/libraries/retrofit2/build.gradle.java11.mustache new file mode 100644 index 0000000000..4b6023df7a --- /dev/null +++ b/src/main/resources/handlebars/Java/libraries/retrofit2/build.gradle.java11.mustache @@ -0,0 +1,114 @@ +plugins { + id 'java' + id 'maven-publish' +} + +repositories { + mavenLocal() + maven { + url = uri('https://repo.maven.apache.org/maven2/') + } +} + +ext { + oltu_version = "1.0.2" + retrofit_version = "2.7.1" + {{#usePlayWS}} + {{#play24}} + jackson_version = "2.11.4" + play_version = "2.4.11" + {{/play24}} + {{#play25}} + jackson_version = "2.11.4" + play_version = "2.5.14" + {{/play25}} + {{/usePlayWS}} + swagger_annotations_version = "{{#useOas2}}1.5.24{{/useOas2}}{{^useOas2}}2.0.0{{/useOas2}}" + junit_version = "4.12" + {{#useRxJava}} + rx_java_version = "1.3.0" + {{/useRxJava}} + {{#useRxJava2}} + rx_java_version = "2.1.1" + {{/useRxJava2}} + {{#joda}} + jodatime_version = "2.10.5" + {{/joda}} + {{#threetenbp}} + threetenbp_version = "1.4.1" + {{/threetenbp}} + json_fire_version = "1.8.3" +} + +dependencies { + implementation "com.squareup.retrofit2:retrofit:$retrofit_version" + implementation "com.squareup.retrofit2:converter-scalars:$retrofit_version" + implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" + {{#useRxJava}} + implementation "com.squareup.retrofit2:adapter-rxjava:$retrofit_version" + implementation "io.reactivex:rxjava:$rx_java_version" + {{/useRxJava}} + {{#useRxJava2}} + implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' + implementation "io.reactivex.rxjava2:rxjava:$rx_java_version" + {{/useRxJava2}} + {{#useOas2}} + implementation "io.swagger:swagger-annotations:$swagger_annotations_version" + {{/useOas2}} + {{^useOas2}} + implementation "io.swagger.core.v3:swagger-annotations:$swagger_annotations_version" + {{/useOas2}} + implementation ("org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:$oltu_version"){ + exclude group:'org.apache.oltu.oauth2' , module: 'org.apache.oltu.oauth2.common' + } + implementation "io.gsonfire:gson-fire:$json_fire_version" + {{#joda}} + implementation "joda-time:joda-time:$jodatime_version" + {{/joda}} + {{#threetenbp}} + implementation "org.threeten:threetenbp:$threetenbp_version" + {{/threetenbp}} + {{#usePlayWS}} + implementation "com.typesafe.play:play-java-ws_2.11:$play_version" + implementation "com.squareup.retrofit2:converter-jackson:$retrofit_version" + implementation "com.fasterxml.jackson.core:jackson-core:$jackson_version" + implementation "com.fasterxml.jackson.core:jackson-annotations:$jackson_version" + implementation "com.fasterxml.jackson.datatype:jackson-datatype-joda:$jackson_version" + {{/usePlayWS}} + implementation "com.sun.xml.ws:jaxws-rt:2.3.3" + {{#wiremock}} + testImplementation "com.github.tomakehurst:wiremock:2.27.2" + {{/wiremock}} + + testImplementation "junit:junit:$junit_version" +} + +group = '{{groupId}}' +version = '{{artifactVersion}}' +description = '{{artifactDescription}}' + +java.sourceCompatibility = 11 +java.targetCompatibility = 11 + +tasks.register('testsJar', Jar) { + archiveClassifier = 'tests' + from(sourceSets.test.output) +} + +java { + withSourcesJar() + withJavadocJar() +} + +publishing { + publications { + maven(MavenPublication) { + from(components.java) + artifact(testsJar) + } + } +} + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} From 1fa14c7df0c17bdc01268fb16ce30a2d1cc23597 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Wed, 3 Nov 2021 10:19:25 -0500 Subject: [PATCH 040/223] added java11 cli option --- .../codegen/v3/generators/java/AbstractJavaCodegen.java | 8 ++++++++ .../v3/generators/options/JavaOptionsProvider.java | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java index e5452c30ec..9ba6d8b6b0 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java @@ -181,6 +181,14 @@ public AbstractJavaCodegen() { java8ModeOptions.put("false", "Various third party libraries as needed"); java8Mode.setEnum(java8ModeOptions); cliOptions.add(java8Mode); + + CliOption java11Mode = new CliOption(JAVA11_MODE, "Option. Use Java11 classes instead of third party equivalents"); + Map java11ModeOptions = new HashMap(); + java11ModeOptions.put("true", "Use Java 11 classes"); + java11ModeOptions.put("false", "Various third party libraries as needed"); + java11Mode.setEnum(java11ModeOptions); + cliOptions.add(java11Mode); + cliOptions.add(CliOption.newBoolean(CHECK_DUPLICATED_MODEL_NAME, "Check if there are duplicated model names (ignoring case)")); } diff --git a/src/test/java/io/swagger/codegen/v3/generators/options/JavaOptionsProvider.java b/src/test/java/io/swagger/codegen/v3/generators/options/JavaOptionsProvider.java index 88e6e19a0c..8b8aff5a22 100644 --- a/src/test/java/io/swagger/codegen/v3/generators/options/JavaOptionsProvider.java +++ b/src/test/java/io/swagger/codegen/v3/generators/options/JavaOptionsProvider.java @@ -31,6 +31,7 @@ public class JavaOptionsProvider implements OptionsProvider { public static final String FULL_JAVA_UTIL_VALUE = "true"; public static final String WITH_XML_VALUE = "false"; public static final String JAVA8_MODE_VALUE = "true"; + public static final String JAVA11_MODE_VALUE = "false"; public static final String ENSURE_UNIQUE_PARAMS_VALUE = "true"; //public static final String SUPPORT_JAVA6 = "true"; public static final String USE_BEANVALIDATION = "false"; @@ -69,6 +70,7 @@ public JavaOptionsProvider() { .put(JavaClientCodegen.FULL_JAVA_UTIL, FULL_JAVA_UTIL_VALUE) .put(JavaClientCodegen.WITH_XML, WITH_XML_VALUE) .put(JavaClientCodegen.JAVA8_MODE, JAVA8_MODE_VALUE) + .put(JavaClientCodegen.JAVA11_MODE, JAVA11_MODE_VALUE) .put(CodegenConstants.SERIALIZE_BIG_DECIMAL_AS_STRING, "true") .put(JavaClientCodegen.DATE_LIBRARY, "joda") .put("hideGenerationTimestamp", "true") From 6bf08f7e30d3a8807740c4c22a7773ea21ecefce Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Mon, 8 Nov 2021 01:18:59 -0500 Subject: [PATCH 041/223] set default date library for java8 --- .../swagger/codegen/v3/generators/java/AbstractJavaCodegen.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java index 9ba6d8b6b0..69bf6e1d3a 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java @@ -449,6 +449,8 @@ public void processOpts() { if (additionalProperties.containsKey(DATE_LIBRARY)) { setDateLibrary(additionalProperties.get("dateLibrary").toString()); + } else if (java8Mode) { + setDateLibrary("java8"); } if ("threetenbp".equals(dateLibrary)) { From c3810ce4c333e898d33081f953d75f8d9c07f651 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Mon, 8 Nov 2021 11:12:16 -0500 Subject: [PATCH 042/223] updated javadocs for java client generators --- src/main/resources/handlebars/Java/libraries/feign/pom.mustache | 2 +- .../resources/handlebars/Java/libraries/jersey2/pom.mustache | 2 +- .../handlebars/Java/libraries/okhttp-gson/pom.mustache | 2 +- .../resources/handlebars/Java/libraries/resteasy/pom.mustache | 2 +- .../handlebars/Java/libraries/resttemplate/pom.mustache | 2 +- .../resources/handlebars/Java/libraries/retrofit/pom.mustache | 2 +- .../resources/handlebars/Java/libraries/retrofit2/pom.mustache | 2 +- src/main/resources/handlebars/Java/pom.mustache | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/resources/handlebars/Java/libraries/feign/pom.mustache b/src/main/resources/handlebars/Java/libraries/feign/pom.mustache index 458201856c..d212388bd2 100644 --- a/src/main/resources/handlebars/Java/libraries/feign/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/feign/pom.mustache @@ -117,7 +117,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.10.4 + 3.2.0 attach-javadocs diff --git a/src/main/resources/handlebars/Java/libraries/jersey2/pom.mustache b/src/main/resources/handlebars/Java/libraries/jersey2/pom.mustache index 78e13ab279..d5b0ee31a9 100644 --- a/src/main/resources/handlebars/Java/libraries/jersey2/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/jersey2/pom.mustache @@ -132,7 +132,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.10.4 + 3.2.0 attach-javadocs diff --git a/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache b/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache index 13230dea51..63e171a7d0 100644 --- a/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/okhttp-gson/pom.mustache @@ -118,7 +118,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.10.4 + 3.2.0 attach-javadocs diff --git a/src/main/resources/handlebars/Java/libraries/resteasy/pom.mustache b/src/main/resources/handlebars/Java/libraries/resteasy/pom.mustache index 8e2bb643f2..c1184d52aa 100644 --- a/src/main/resources/handlebars/Java/libraries/resteasy/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/resteasy/pom.mustache @@ -113,7 +113,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.10.4 + 3.2.0 diff --git a/src/main/resources/handlebars/Java/libraries/resttemplate/pom.mustache b/src/main/resources/handlebars/Java/libraries/resttemplate/pom.mustache index 2edc1856c9..247b7251e9 100644 --- a/src/main/resources/handlebars/Java/libraries/resttemplate/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/resttemplate/pom.mustache @@ -133,7 +133,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.10.4 + 3.2.0 attach-javadocs diff --git a/src/main/resources/handlebars/Java/libraries/retrofit/pom.mustache b/src/main/resources/handlebars/Java/libraries/retrofit/pom.mustache index 5673a3aacb..4f1ad53552 100644 --- a/src/main/resources/handlebars/Java/libraries/retrofit/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/retrofit/pom.mustache @@ -126,7 +126,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.10.4 + 3.2.0 attach-javadocs diff --git a/src/main/resources/handlebars/Java/libraries/retrofit2/pom.mustache b/src/main/resources/handlebars/Java/libraries/retrofit2/pom.mustache index cfb0780585..75033db69a 100644 --- a/src/main/resources/handlebars/Java/libraries/retrofit2/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/retrofit2/pom.mustache @@ -118,7 +118,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.10.4 + 3.2.0 attach-javadocs diff --git a/src/main/resources/handlebars/Java/pom.mustache b/src/main/resources/handlebars/Java/pom.mustache index 3eeb3fa208..c2bf8383ec 100644 --- a/src/main/resources/handlebars/Java/pom.mustache +++ b/src/main/resources/handlebars/Java/pom.mustache @@ -133,7 +133,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 2.10.4 + 3.2.0 attach-javadocs From 747c0e4f4b4eaf1b0f2bd2754740ff4019ab77cd Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Wed, 10 Nov 2021 12:51:32 -0500 Subject: [PATCH 043/223] split `fromProperty` method. --- .../v3/generators/DefaultCodegenConfig.java | 85 +++++++++++-------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java index bf590857b7..684564e9bc 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java +++ b/src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java @@ -1578,36 +1578,62 @@ public CodegenProperty fromProperty(String name, Schema propertySchema) { codegenProperty.name = toVarName(name); codegenProperty.baseName = name; codegenProperty.nameInCamelCase = camelize(codegenProperty.name, false); - codegenProperty.description = escapeText(propertySchema.getDescription()); - codegenProperty.unescapedDescription = propertySchema.getDescription(); - codegenProperty.title = propertySchema.getTitle(); codegenProperty.getter = toGetter(name); codegenProperty.setter = toSetter(name); - String example = toExampleValue(propertySchema); + setSchemaProperties(name, codegenProperty, propertySchema); + + final String type = getSchemaType(propertySchema); + + processPropertySchemaTypes(name, codegenProperty, propertySchema); + + codegenProperty.datatype = getTypeDeclaration(propertySchema); + codegenProperty.dataFormat = propertySchema.getFormat(); + + // this can cause issues for clients which don't support enums + boolean isEnum = getBooleanValue(codegenProperty, IS_ENUM_EXT_NAME); + if (isEnum) { + codegenProperty.datatypeWithEnum = toEnumName(codegenProperty); + codegenProperty.enumName = toEnumName(codegenProperty); + } else { + codegenProperty.datatypeWithEnum = codegenProperty.datatype; + } + + codegenProperty.baseType = getSchemaType(propertySchema); + + processPropertySchemaContainerTypes(codegenProperty, propertySchema, type); + return codegenProperty; + } + + protected void setSchemaProperties(String name, CodegenProperty codegenProperty, Schema schema) { + codegenProperty.description = escapeText(schema.getDescription()); + codegenProperty.unescapedDescription = schema.getDescription(); + codegenProperty.title = schema.getTitle(); + String example = toExampleValue(schema); if(!"null".equals(example)) { codegenProperty.example = example; } - codegenProperty.defaultValue = toDefaultValue(propertySchema); - codegenProperty.defaultValueWithParam = toDefaultValueWithParam(name, propertySchema); - codegenProperty.jsonSchema = Json.pretty(propertySchema); - codegenProperty.nullable = Boolean.TRUE.equals(propertySchema.getNullable()); - codegenProperty.getVendorExtensions().put(CodegenConstants.IS_NULLABLE_EXT_NAME, Boolean.TRUE.equals(propertySchema.getNullable())); - if (propertySchema.getReadOnly() != null) { - codegenProperty.getVendorExtensions().put(CodegenConstants.IS_READ_ONLY_EXT_NAME, propertySchema.getReadOnly()); - } - if (propertySchema.getXml() != null) { - if (propertySchema.getXml().getAttribute() != null) { - codegenProperty.getVendorExtensions().put(CodegenConstants.IS_XML_ATTRIBUTE_EXT_NAME, propertySchema.getXml().getAttribute()); + codegenProperty.defaultValue = toDefaultValue(schema); + codegenProperty.defaultValueWithParam = toDefaultValueWithParam(name, schema); + codegenProperty.jsonSchema = Json.pretty(schema); + codegenProperty.nullable = Boolean.TRUE.equals(schema.getNullable()); + codegenProperty.getVendorExtensions().put(CodegenConstants.IS_NULLABLE_EXT_NAME, Boolean.TRUE.equals(schema.getNullable())); + if (schema.getReadOnly() != null) { + codegenProperty.getVendorExtensions().put(CodegenConstants.IS_READ_ONLY_EXT_NAME, schema.getReadOnly()); + } + if (schema.getXml() != null) { + if (schema.getXml().getAttribute() != null) { + codegenProperty.getVendorExtensions().put(CodegenConstants.IS_XML_ATTRIBUTE_EXT_NAME, schema.getXml().getAttribute()); } - codegenProperty.xmlPrefix = propertySchema.getXml().getPrefix(); - codegenProperty.xmlName = propertySchema.getXml().getName(); - codegenProperty.xmlNamespace = propertySchema.getXml().getNamespace(); + codegenProperty.xmlPrefix = schema.getXml().getPrefix(); + codegenProperty.xmlName = schema.getXml().getName(); + codegenProperty.xmlNamespace = schema.getXml().getNamespace(); } - if (propertySchema.getExtensions() != null && !propertySchema.getExtensions().isEmpty()) { - codegenProperty.getVendorExtensions().putAll(propertySchema.getExtensions()); + if (schema.getExtensions() != null && !schema.getExtensions().isEmpty()) { + codegenProperty.getVendorExtensions().putAll(schema.getExtensions()); } + } - final String type = getSchemaType(propertySchema); + protected void processPropertySchemaTypes(String name, CodegenProperty codegenProperty, Schema propertySchema) { if (propertySchema instanceof IntegerSchema) { codegenProperty.getVendorExtensions().put(CodegenConstants.IS_NUMERIC_EXT_NAME, Boolean.TRUE); if(SchemaTypeUtil.INTEGER64_FORMAT.equals(propertySchema.getFormat())) { @@ -1644,7 +1670,6 @@ public CodegenProperty fromProperty(String name, Schema propertySchema) { codegenProperty.allowableValues = allowableValues; } } - if (propertySchema instanceof StringSchema) { codegenProperty.maxLength = propertySchema.getMaxLength(); codegenProperty.minLength = propertySchema.getMinLength(); @@ -1715,20 +1740,9 @@ public CodegenProperty fromProperty(String name, Schema propertySchema) { codegenProperty.getVendorExtensions().put(CodegenConstants.IS_DATE_TIME_EXT_NAME, Boolean.TRUE); handlePropertySchema(propertySchema, codegenProperty); } - codegenProperty.datatype = getTypeDeclaration(propertySchema); - codegenProperty.dataFormat = propertySchema.getFormat(); - - // this can cause issues for clients which don't support enums - boolean isEnum = getBooleanValue(codegenProperty, IS_ENUM_EXT_NAME); - if (isEnum) { - codegenProperty.datatypeWithEnum = toEnumName(codegenProperty); - codegenProperty.enumName = toEnumName(codegenProperty); - } else { - codegenProperty.datatypeWithEnum = codegenProperty.datatype; - } - - codegenProperty.baseType = getSchemaType(propertySchema); + } + protected void processPropertySchemaContainerTypes(CodegenProperty codegenProperty, Schema propertySchema, String type) { if (propertySchema instanceof ArraySchema) { codegenProperty.getVendorExtensions().put(CodegenConstants.IS_CONTAINER_EXT_NAME, Boolean.TRUE); codegenProperty.getVendorExtensions().put(CodegenConstants.IS_LIST_CONTAINER_EXT_NAME, Boolean.TRUE); @@ -1784,7 +1798,6 @@ public CodegenProperty fromProperty(String name, Schema propertySchema) { } setNonArrayMapProperty(codegenProperty, type); } - return codegenProperty; } private void handleMinMaxValues(Schema propertySchema, CodegenProperty codegenProperty) { From b284095dcac30242571aec4fe8554af31f9438fa Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Wed, 10 Nov 2021 12:52:35 -0500 Subject: [PATCH 044/223] use schema related to a ref schema property --- .../codegen/v3/generators/java/SpringCodegen.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java index e3b4770efb..111239a356 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java @@ -21,6 +21,7 @@ import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; +import io.swagger.v3.oas.models.media.Schema; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -468,6 +469,19 @@ public void execute(Template.Fragment fragment, Writer writer) throws IOExceptio } } + @Override + public CodegenProperty fromProperty(String name, Schema propertySchema) { + CodegenProperty codegenProperty = super.fromProperty(name, propertySchema); + if (propertySchema != null && propertySchema.get$ref() != null) { + Schema refSchema = OpenAPIUtil.getSchemaFromRefSchema(propertySchema, this.openAPI); + if (refSchema != null && !isObjectSchema(refSchema) && refSchema.getEnum() == null) { + setSchemaProperties(name, codegenProperty, refSchema); + processPropertySchemaTypes(name, codegenProperty, refSchema); + } + } + return codegenProperty; + } + @Override public void addOperationToGroup(String tag, String resourcePath, Operation operation, CodegenOperation co, Map> operations) { if((isDefaultLibrary() || isSpringMvcLibrary()) && !useTags) { From 17069ed2eaf79ce50d6d119226bcc4c2b4e56ba9 Mon Sep 17 00:00:00 2001 From: frantuma Date: Thu, 18 Nov 2021 15:52:34 +0100 Subject: [PATCH 045/223] prepare release 1.0.30 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e8119a0d89..1051697444 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.swagger.codegen.v3 swagger-codegen-generators - 1.0.30-SNAPSHOT + 1.0.30 jar @@ -254,7 +254,7 @@ - 3.0.30-SNAPSHOT + 3.0.30 2.0.28 2.1.11 2.12.1 From 2ac0a0cffff4402fd642684a328852c14bfa0c27 Mon Sep 17 00:00:00 2001 From: frantuma Date: Thu, 18 Nov 2021 17:13:25 +0100 Subject: [PATCH 046/223] bump snapshot 1.0.31-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1051697444..ec7fecd742 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.swagger.codegen.v3 swagger-codegen-generators - 1.0.30 + 1.0.31-SNAPSHOT jar From 2b481cc78d7c72bfd6302efbca8b74838839904d Mon Sep 17 00:00:00 2001 From: frantuma Date: Thu, 18 Nov 2021 21:44:25 +0100 Subject: [PATCH 047/223] bump codegen to 3.0.31-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ec7fecd742..4329dc714c 100644 --- a/pom.xml +++ b/pom.xml @@ -254,7 +254,7 @@ - 3.0.30 + 3.0.31-SNAPSHOT 2.0.28 2.1.11 2.12.1 From 1c3251bc939b13f86cd6d8f0dcd57c17bfdf56a2 Mon Sep 17 00:00:00 2001 From: gracekarina Date: Fri, 19 Nov 2021 12:28:46 -0500 Subject: [PATCH 048/223] modify readme and sh file to allow full url --- src/main/resources/handlebars/php/README.mustache | 2 +- .../resources/handlebars/php/git_push.sh.mustache | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/resources/handlebars/php/README.mustache b/src/main/resources/handlebars/php/README.mustache index 0dd35fa58e..aa14f464c2 100644 --- a/src/main/resources/handlebars/php/README.mustache +++ b/src/main/resources/handlebars/php/README.mustache @@ -31,7 +31,7 @@ To install the bindings via [Composer](http://getcomposer.org/), add the followi "repositories": [ { "type": "git", - "url": "http://{{gitRepoBaseURL}}.com/{{#composerVendorName}}{{.}}{{/composerVendorName}}{{^composerVendorName}}{{gitUserId}}{{/composerVendorName}}/{{#composerProjectName}}{{.}}{{/composerProjectName}}{{^composerProjectName}}{{gitRepoId}}{{/composerProjectName}}.git" + "url": "{{gitRepoBaseURL}}/{{#composerVendorName}}{{.}}{{/composerVendorName}}{{^composerVendorName}}{{gitUserId}}{{/composerVendorName}}/{{#composerProjectName}}{{.}}{{/composerProjectName}}{{^composerProjectName}}{{gitRepoId}}{{/composerProjectName}}.git" } ], "require": { diff --git a/src/main/resources/handlebars/php/git_push.sh.mustache b/src/main/resources/handlebars/php/git_push.sh.mustache index dd518fc96d..130b3986ec 100755 --- a/src/main/resources/handlebars/php/git_push.sh.mustache +++ b/src/main/resources/handlebars/php/git_push.sh.mustache @@ -6,6 +6,7 @@ git_user_id=$1 git_repo_id=$2 release_note=$3 +git_repo_base_url=$4 if [ "$git_user_id" = "" ]; then git_user_id="{{{gitUserId}}}" @@ -22,6 +23,11 @@ if [ "$release_note" = "" ]; then echo "[INFO] No command line input provided. Set \$release_note to $release_note" fi +if [ "$git_repo_base_url" = "" ]; then + git_repo_base_url="{{{gitRepoBaseURL}}}" + echo "[INFO] No command line input provided. Set \$git_repo_base_url to $git_repo_base_url" +fi + # Initialize the local directory as a Git repository git init @@ -37,9 +43,11 @@ if [ "$git_remote" = "" ]; then # git remote not defined if [ "$GIT_TOKEN" = "" ]; then echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." - git remote add origin https://${git_repo_base_url}.com/${git_user_id}/${git_repo_id}.git + git remote add origin ${git_repo_base_url}/${git_user_id}/${git_repo_id}.git else - git remote add origin https://${git_user_id}:${GIT_TOKEN}@${git_repo_base_url}.com/${git_user_id}/${git_repo_id}.git + git_repo_base_url=${git_repo_base_url#*//} + git_repo_base_url=${git_repo_base_url%%.*} + git remote add origin https://${git_user_id}:${GIT_TOKEN}@${git_repo_base_url}/${git_user_id}/${git_repo_id}.git fi fi @@ -47,6 +55,6 @@ fi git pull origin master # Pushes (Forces) the changes in the local repository up to the remote repository -echo "Git pushing to https://${git_repo_base_url}.com/${git_user_id}/${git_repo_id}.git" +echo "Git pushing to ${git_repo_base_url}/${git_user_id}/${git_repo_id}.git" git push origin master 2>&1 | grep -v 'To https' From b02bdc86b58909783dec63cfd3e3bebc07873abd Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Tue, 23 Nov 2021 18:14:33 -0500 Subject: [PATCH 049/223] fixed build error when array type is present on ref schema --- .../io/swagger/codegen/v3/generators/java/SpringCodegen.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java index 111239a356..767e62d1f1 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java @@ -21,6 +21,7 @@ import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; +import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.Schema; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -474,7 +475,7 @@ public CodegenProperty fromProperty(String name, Schema propertySchema) { CodegenProperty codegenProperty = super.fromProperty(name, propertySchema); if (propertySchema != null && propertySchema.get$ref() != null) { Schema refSchema = OpenAPIUtil.getSchemaFromRefSchema(propertySchema, this.openAPI); - if (refSchema != null && !isObjectSchema(refSchema) && refSchema.getEnum() == null) { + if (refSchema != null && !isObjectSchema(refSchema) && !(refSchema instanceof ArraySchema) && refSchema.getEnum() == null) { setSchemaProperties(name, codegenProperty, refSchema); processPropertySchemaTypes(name, codegenProperty, refSchema); } From e3fbdfde36f9ff28ef559f29246b231544e5f35f Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Sat, 18 Dec 2021 19:35:12 -0500 Subject: [PATCH 050/223] added jackson annotations on oneof generated interface for deserialization --- .../codegen/v3/generators/SchemaHandler.java | 12 +++++++++++- .../resources/handlebars/Java/interface.mustache | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/SchemaHandler.java b/src/main/java/io/swagger/codegen/v3/generators/SchemaHandler.java index cfcf7e60a6..e4e908f579 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/SchemaHandler.java +++ b/src/main/java/io/swagger/codegen/v3/generators/SchemaHandler.java @@ -175,7 +175,17 @@ protected void addInterfaces(List schemas, CodegenModel codegenModel, Ma continue; } final String schemaName = ref.substring(ref.lastIndexOf("/") + 1); - this.addInterfaceModel(allModels.get(codegenConfig.toModelName(schemaName)), codegenModel); + + final CodegenModel model = allModels.get(codegenConfig.toModelName(schemaName)); + this.addInterfaceModel(model, codegenModel); + + boolean subTypeAdded = false; + if (codegenModel.getSubTypes() != null) { + subTypeAdded = codegenModel.getSubTypes().stream().anyMatch(existingSubType -> existingSubType.classname.equalsIgnoreCase(model.classname)); + } + if (!subTypeAdded) { + codegenModel.addSubType(model); + } } } diff --git a/src/main/resources/handlebars/Java/interface.mustache b/src/main/resources/handlebars/Java/interface.mustache index becc0c5549..bd8ff9a735 100644 --- a/src/main/resources/handlebars/Java/interface.mustache +++ b/src/main/resources/handlebars/Java/interface.mustache @@ -1,6 +1,21 @@ +{{#jackson}} +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +{{/jackson}} /** * {{#description}}{{.}}{{/description}}{{^description}}{{classname}}{{/description}} */ +{{#jackson}} +@JsonTypeInfo( + use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.PROPERTY, + property = "type") +@JsonSubTypes({ + {{#subTypes}} + @JsonSubTypes.Type(value = {{classname}}.class, name = "{{classname}}"){{^@last}},{{/@last}} + {{/subTypes}} +}) +{{/jackson}} public interface {{{classname}}} { } From 24aa32ee6ecfc40ce77255618b299b6dbe19a0c5 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Tue, 21 Dec 2021 23:22:55 -0500 Subject: [PATCH 051/223] updated templates to fix compile errors on java generators --- .../handlebars/Java/libraries/feign/ApiClient.mustache | 2 +- .../handlebars/Java/libraries/retrofit/ApiClient.mustache | 2 +- .../handlebars/Java/libraries/retrofit2/ApiClient.mustache | 2 +- src/main/resources/handlebars/Java/modelEnum.mustache | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/handlebars/Java/libraries/feign/ApiClient.mustache b/src/main/resources/handlebars/Java/libraries/feign/ApiClient.mustache index 99153a2fcd..48d038345a 100644 --- a/src/main/resources/handlebars/Java/libraries/feign/ApiClient.mustache +++ b/src/main/resources/handlebars/Java/libraries/feign/ApiClient.mustache @@ -53,7 +53,7 @@ public class ApiClient { this(); for(String authName : authNames) { {{#hasAuthMethods}} - RequestInterceptor auth; + RequestInterceptor auth = null; {{#authMethods}}if ("{{name}}".equals(authName)) { {{#is this 'basic'}} auth = new HttpBasicAuth(); diff --git a/src/main/resources/handlebars/Java/libraries/retrofit/ApiClient.mustache b/src/main/resources/handlebars/Java/libraries/retrofit/ApiClient.mustache index 12c2f0efc5..487cc233d7 100644 --- a/src/main/resources/handlebars/Java/libraries/retrofit/ApiClient.mustache +++ b/src/main/resources/handlebars/Java/libraries/retrofit/ApiClient.mustache @@ -54,7 +54,7 @@ public class ApiClient { this(); for(String authName : authNames) { {{#hasAuthMethods}} - Interceptor auth; + Interceptor auth = null; {{#authMethods}}if ("{{name}}".equals(authName)) { {{#is this 'basic'}} auth = new HttpBasicAuth(); diff --git a/src/main/resources/handlebars/Java/libraries/retrofit2/ApiClient.mustache b/src/main/resources/handlebars/Java/libraries/retrofit2/ApiClient.mustache index f3b9efc618..64b2648585 100644 --- a/src/main/resources/handlebars/Java/libraries/retrofit2/ApiClient.mustache +++ b/src/main/resources/handlebars/Java/libraries/retrofit2/ApiClient.mustache @@ -61,7 +61,7 @@ public class ApiClient { this(); for(String authName : authNames) { {{#hasAuthMethods}} - Interceptor auth; + Interceptor auth = null; {{#authMethods}}if ("{{name}}".equals(authName)) { {{#is this 'basic'}} auth = new HttpBasicAuth(); diff --git a/src/main/resources/handlebars/Java/modelEnum.mustache b/src/main/resources/handlebars/Java/modelEnum.mustache index b85cf1e86b..ba7089cab9 100644 --- a/src/main/resources/handlebars/Java/modelEnum.mustache +++ b/src/main/resources/handlebars/Java/modelEnum.mustache @@ -52,7 +52,7 @@ public enum {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum } {{^errorOnUnknownEnum}}return null;{{/errorOnUnknownEnum}}{{#errorOnUnknownEnum}}throw new IllegalArgumentException("Unexpected value '" + text + "' for '{{{classname}}}' enum.");{{/errorOnUnknownEnum}} } -{{#if gson}} +{{#gson}} public static class Adapter extends TypeAdapter<{{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}> { @Override @@ -63,8 +63,8 @@ public enum {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum @Override public {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} read(final JsonReader jsonReader) throws IOException { Object value = {{#isNumber}}new BigDecimal(jsonReader.nextDouble()){{/isNumber}}{{^isNumber}}jsonReader.{{#isInteger}}nextInt(){{/isInteger}}{{^isInteger}}nextString(){{/isInteger}}{{/isNumber}}; - return {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.fromValue(({{{datatype}}})(value)); + return {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}.fromValue(({{{dataType}}})(value)); } } -{{/if}} +{{/gson}} } From 78eefd0c73eb64a67245c10ed4182b710ec15ea3 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Tue, 21 Dec 2021 23:36:24 -0500 Subject: [PATCH 052/223] added jackson annotations for interfaces on spring generator --- .../handlebars/JavaSpring/interface.mustache | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/resources/handlebars/JavaSpring/interface.mustache b/src/main/resources/handlebars/JavaSpring/interface.mustache index becc0c5549..bd8ff9a735 100644 --- a/src/main/resources/handlebars/JavaSpring/interface.mustache +++ b/src/main/resources/handlebars/JavaSpring/interface.mustache @@ -1,6 +1,21 @@ +{{#jackson}} +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +{{/jackson}} /** * {{#description}}{{.}}{{/description}}{{^description}}{{classname}}{{/description}} */ +{{#jackson}} +@JsonTypeInfo( + use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.PROPERTY, + property = "type") +@JsonSubTypes({ + {{#subTypes}} + @JsonSubTypes.Type(value = {{classname}}.class, name = "{{classname}}"){{^@last}},{{/@last}} + {{/subTypes}} +}) +{{/jackson}} public interface {{{classname}}} { } From a3071755cb710ebb9d7ab28ad9919a961ae231d9 Mon Sep 17 00:00:00 2001 From: frantuma Date: Thu, 23 Dec 2021 22:09:38 +0100 Subject: [PATCH 053/223] bump logback to 1.2.9 --- pom.xml | 4 ++-- .../handlebars/JavaInflector/pom.mustache | 2 +- .../handlebars/JavaJaxRS/cxf/pom.mustache | 6 +++--- .../JavaJaxRS/cxf/server/pom.mustache | 18 +++++++++--------- .../handlebars/JavaJaxRS/pom.mustache | 6 +++--- .../libraries/ktor/build.gradle.mustache | 2 +- 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index 4329dc714c..d8b479c168 100644 --- a/pom.xml +++ b/pom.xml @@ -255,8 +255,8 @@ 3.0.31-SNAPSHOT - 2.0.28 - 2.1.11 + 2.0.29 + 2.1.12 2.12.1 2.11.1 3.3.0 diff --git a/src/main/resources/handlebars/JavaInflector/pom.mustache b/src/main/resources/handlebars/JavaInflector/pom.mustache index dabf47f8cf..b01b8b4495 100644 --- a/src/main/resources/handlebars/JavaInflector/pom.mustache +++ b/src/main/resources/handlebars/JavaInflector/pom.mustache @@ -124,7 +124,7 @@ UTF-8 1.0.0 9.4.9.v20180320 - 1.0.1 + 1.2.9 4.13.1 1.6.3 2.0.0 diff --git a/src/main/resources/handlebars/JavaJaxRS/cxf/pom.mustache b/src/main/resources/handlebars/JavaJaxRS/cxf/pom.mustache index 78c26d56ac..24aea6d203 100644 --- a/src/main/resources/handlebars/JavaJaxRS/cxf/pom.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/cxf/pom.mustache @@ -141,7 +141,7 @@ ${cxf-version} test - + org.apache.cxf @@ -187,7 +187,7 @@ ${jackson-jaxrs-version} {{/java8}} -{{#useBeanValidationFeature}} +{{#useBeanValidationFeature}} org.hibernate hibernate-validator @@ -226,7 +226,7 @@ {{/useOas2}} 9.2.9.v20150224 4.13.1 - 1.1.7 + 1.2.9 2.5 {{#useBeanValidation}} 1.1.0.Final diff --git a/src/main/resources/handlebars/JavaJaxRS/cxf/server/pom.mustache b/src/main/resources/handlebars/JavaJaxRS/cxf/server/pom.mustache index 88b8cf8ab0..b59e397af1 100644 --- a/src/main/resources/handlebars/JavaJaxRS/cxf/server/pom.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/cxf/server/pom.mustache @@ -88,7 +88,7 @@ - + maven-war-plugin @@ -150,7 +150,7 @@ ${cxf-version} test - + org.apache.cxf @@ -212,7 +212,7 @@ ${jackson-jaxrs-version} {{/java8}} -{{#generateSpringApplication}} +{{#generateSpringApplication}} org.springframework @@ -223,7 +223,7 @@ org.springframework spring-web ${spring-version} - + {{/generateSpringApplication}} {{#generateSpringBootApplication}} @@ -240,7 +240,7 @@ ${spring.boot-version} test - + org.apache.cxf cxf-spring-boot-starter-jaxrs @@ -287,17 +287,17 @@ {{/useOas2}} 9.2.9.v20150224 4.13.1 - 1.1.7 + 1.2.9 2.5 {{#useBeanValidation}} 1.1.0.Final {{/useBeanValidation}} -{{#generateSpringApplication}} +{{#generateSpringApplication}} 4.3.13.RELEASE -{{/generateSpringApplication}} +{{/generateSpringApplication}} {{#generateSpringBootApplication}} 1.5.9.RELEASE -{{/generateSpringBootApplication}} +{{/generateSpringBootApplication}} 3.2.4 2.9.1 UTF-8 diff --git a/src/main/resources/handlebars/JavaJaxRS/pom.mustache b/src/main/resources/handlebars/JavaJaxRS/pom.mustache index 6888f74e55..d7865064d3 100644 --- a/src/main/resources/handlebars/JavaJaxRS/pom.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/pom.mustache @@ -13,7 +13,7 @@ repo - + src/main/java @@ -201,7 +201,7 @@ ${commons_io_version} {{/supportJava6}} - + {{#useBeanValidation}} @@ -240,7 +240,7 @@ 3.5 {{/supportJava6}} 4.13.1 - 1.1.7 + 1.2.9 2.5 {{#useBeanValidation}} 1.1.0.Final diff --git a/src/main/resources/handlebars/kotlin-server/libraries/ktor/build.gradle.mustache b/src/main/resources/handlebars/kotlin-server/libraries/ktor/build.gradle.mustache index 91d110adaa..afc640feda 100644 --- a/src/main/resources/handlebars/kotlin-server/libraries/ktor/build.gradle.mustache +++ b/src/main/resources/handlebars/kotlin-server/libraries/ktor/build.gradle.mustache @@ -66,6 +66,6 @@ dependencies { compile "io.ktor:ktor-gson:$ktor_version" compile "io.ktor:ktor-client-core:$ktor_version" compile "io.ktor:ktor-client-apache:$ktor_version" - compile "ch.qos.logback:logback-classic:1.2.1" + compile "ch.qos.logback:logback-classic:1.2.9" testCompile group: 'junit', name: 'junit', version: '4.12' } From e9bf219a475222b9f805d159d27098f86cdf5e9c Mon Sep 17 00:00:00 2001 From: frantuma Date: Tue, 28 Dec 2021 15:41:42 +0100 Subject: [PATCH 054/223] prepare release 1.0.31 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d8b479c168..fb3dc20cbd 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.swagger.codegen.v3 swagger-codegen-generators - 1.0.31-SNAPSHOT + 1.0.31 jar @@ -254,7 +254,7 @@ - 3.0.31-SNAPSHOT + 3.0.31 2.0.29 2.1.12 2.12.1 From 5d28068676f718d938f502b64c6ca8eefd887566 Mon Sep 17 00:00:00 2001 From: frantuma Date: Mon, 3 Jan 2022 14:08:20 +0100 Subject: [PATCH 055/223] bump next snapshot 1.0.32-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fb3dc20cbd..83481f9cc9 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.swagger.codegen.v3 swagger-codegen-generators - 1.0.31 + 1.0.32-SNAPSHOT jar From 99241db27e5ad488a358b868f13c41834e9667e7 Mon Sep 17 00:00:00 2001 From: frantuma Date: Mon, 3 Jan 2022 14:26:54 +0100 Subject: [PATCH 056/223] bump codegen to 3.0.32-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 83481f9cc9..77d2f77c8c 100644 --- a/pom.xml +++ b/pom.xml @@ -254,7 +254,7 @@ - 3.0.31 + 3.0.32-SNAPSHOT 2.0.29 2.1.12 2.12.1 From 79a07f6e2c0a0492c04d60bff159a878877e005b Mon Sep 17 00:00:00 2001 From: fzyzcjy <5236035+fzyzcjy@users.noreply.github.com> Date: Sun, 16 Jan 2022 17:05:15 +0800 Subject: [PATCH 057/223] Update api_client.mustache --- src/main/resources/handlebars/dart/api_client.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/handlebars/dart/api_client.mustache b/src/main/resources/handlebars/dart/api_client.mustache index 8195bb9dd9..f20af46c7b 100644 --- a/src/main/resources/handlebars/dart/api_client.mustache +++ b/src/main/resources/handlebars/dart/api_client.mustache @@ -105,7 +105,7 @@ class ApiClient { _updateParamsForAuth(authNames, queryParams, headerParams); - var ps = queryParams.where((p) => p.value != null).map((p) => '${p.name}=${p.value}'); + var ps = queryParams.where((p) => p.value != null).map((p) => '${Uri.encodeComponent(p.name)}=${Uri.encodeComponent(p.value)}'); String queryString = ps.isNotEmpty ? '?' + ps.join('&') : ''; From b3460d7aa3ed82819761384cdf42a304221ad3f7 Mon Sep 17 00:00:00 2001 From: frantuma Date: Mon, 7 Feb 2022 23:08:14 +0100 Subject: [PATCH 058/223] update dependencies and prepare release 1.0.32 --- pom.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 77d2f77c8c..82265bb3b9 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.swagger.codegen.v3 swagger-codegen-generators - 1.0.32-SNAPSHOT + 1.0.32 jar @@ -254,18 +254,18 @@ - 3.0.32-SNAPSHOT - 2.0.29 - 2.1.12 + 3.0.33 + 2.0.30 + 2.1.13 2.12.1 2.11.1 3.3.0 - 2.4 - 1.2 + 2.11.0 + 1.5.0 4.13.1 1.0.0 - 3.4 - 1.7.12 + 3.12.0 + 1.7.35 3.2.1 6.9.6 2.19.1 From 131f0ce1e4a696014d5a1e253fc12526d086469a Mon Sep 17 00:00:00 2001 From: frantuma Date: Mon, 7 Feb 2022 23:40:19 +0100 Subject: [PATCH 059/223] bump next snapshot 1.0.34-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 82265bb3b9..6dd5535517 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.swagger.codegen.v3 swagger-codegen-generators - 1.0.32 + 1.0.34-SNAPSHOT jar From e9b2f404b3af6eea6603a7ac9d40683cd295ca5a Mon Sep 17 00:00:00 2001 From: frantuma Date: Tue, 8 Feb 2022 06:49:34 +0100 Subject: [PATCH 060/223] bump codegen 3.0.34-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6dd5535517..d184a99955 100644 --- a/pom.xml +++ b/pom.xml @@ -254,7 +254,7 @@ - 3.0.33 + 3.0.34-SNAPSHOT 2.0.30 2.1.13 2.12.1 From 3a6a68e40baeb56b7525c323328789b02a666323 Mon Sep 17 00:00:00 2001 From: Francesco Tumanischvili Date: Mon, 14 Feb 2022 16:50:14 +0100 Subject: [PATCH 061/223] Migrate .whitesource configuration file to inheritance mode --- .whitesource | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/.whitesource b/.whitesource index db4b0fec82..2aa441810e 100644 --- a/.whitesource +++ b/.whitesource @@ -1,15 +1,3 @@ { - "scanSettings": { - "configMode": "AUTO", - "configExternalURL": "", - "projectToken": "", - "baseBranches": [] - }, - "checkRunSettings": { - "vulnerableCheckRunConclusionLevel": "failure", - "displayMode": "diff" - }, - "issueSettings": { - "minSeverityLevel": "LOW" - } -} \ No newline at end of file + "settingsInheritedFrom": "swagger-api/whitesource-config@main" +} From 8a978d85082fc7d0a6ad30e6172cf04abf86f978 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Fri, 11 Feb 2022 05:22:20 -0500 Subject: [PATCH 062/223] fixed backslash incompatibility with handlebar 4.2.1 version --- src/main/resources/handlebars/php/README.mustache | 2 +- src/main/resources/handlebars/php/api_doc.mustache | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/handlebars/php/README.mustache b/src/main/resources/handlebars/php/README.mustache index aa14f464c2..f0c99368f9 100644 --- a/src/main/resources/handlebars/php/README.mustache +++ b/src/main/resources/handlebars/php/README.mustache @@ -79,7 +79,7 @@ $config = {{{invokerPackage}}}\Configuration::getDefaultConfiguration()->setApiK $config = {{{invokerPackage}}}\Configuration::getDefaultConfiguration()->setAccessToken('YOUR_ACCESS_TOKEN');{{/isOAuth}}{{/authMethods}} {{/hasAuthMethods}} -$apiInstance = new {{concat apiPackage '\\' classname}}( +$apiInstance = new {{apiPackage}}{{backSlash}}{{classname}}( // If you want use custom http client, pass your client which implements `GuzzleHttp\ClientInterface`. // This is optional, `GuzzleHttp\Client` will be used as default. new GuzzleHttp\Client(){{#hasAuthMethods}}, diff --git a/src/main/resources/handlebars/php/api_doc.mustache b/src/main/resources/handlebars/php/api_doc.mustache index 82b09a7432..c3f66fdbe2 100644 --- a/src/main/resources/handlebars/php/api_doc.mustache +++ b/src/main/resources/handlebars/php/api_doc.mustache @@ -1,4 +1,4 @@ -# {{concat invokerPackage '\\' classname}}{{#description}} +# {{invokerPackage}}{{backSlash}}{{classname}}{{#description}} {{description}}{{/description}} All URIs are relative to *{{basePath}}* @@ -40,7 +40,7 @@ $config = {{{invokerPackage}}}\Configuration::getDefaultConfiguration()->setApiK $config = {{{invokerPackage}}}\Configuration::getDefaultConfiguration()->setAccessToken('YOUR_ACCESS_TOKEN');{{/isOAuth}}{{/authMethods}} {{/hasAuthMethods}} -$apiInstance = new {{concat apiPackage '\\' classname}}( +$apiInstance = new {{apiPackage}}{{backSlash}}{{classname}}( // If you want use custom http client, pass your client which implements `GuzzleHttp\ClientInterface`. // This is optional, `GuzzleHttp\Client` will be used as default. new GuzzleHttp\Client(){{#hasAuthMethods}}, From 769e2642d9edcb1b7976360be5a1067de819d56e Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Sun, 20 Feb 2022 17:10:03 -0500 Subject: [PATCH 063/223] fixed map type issue --- .../codegen/v3/generators/java/SpringCodegen.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java index 767e62d1f1..822c1f4444 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/SpringCodegen.java @@ -22,8 +22,8 @@ import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; import io.swagger.v3.oas.models.media.ArraySchema; +import io.swagger.v3.oas.models.media.MapSchema; import io.swagger.v3.oas.models.media.Schema; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,7 +31,13 @@ import java.io.IOException; import java.io.Writer; import java.net.URL; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; import java.util.regex.Matcher; import java.util.stream.Collectors; @@ -475,7 +481,7 @@ public CodegenProperty fromProperty(String name, Schema propertySchema) { CodegenProperty codegenProperty = super.fromProperty(name, propertySchema); if (propertySchema != null && propertySchema.get$ref() != null) { Schema refSchema = OpenAPIUtil.getSchemaFromRefSchema(propertySchema, this.openAPI); - if (refSchema != null && !isObjectSchema(refSchema) && !(refSchema instanceof ArraySchema) && refSchema.getEnum() == null) { + if (refSchema != null && !isObjectSchema(refSchema) && !(refSchema instanceof ArraySchema) && !(refSchema instanceof MapSchema) && refSchema.getEnum() == null) { setSchemaProperties(name, codegenProperty, refSchema); processPropertySchemaTypes(name, codegenProperty, refSchema); } From 0eb440796c91bc91d921423025afed770061314b Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Wed, 23 Feb 2022 01:53:16 -0500 Subject: [PATCH 064/223] moved wiremoock option to base java generator class. --- .../codegen/v3/generators/java/AbstractJavaCodegen.java | 9 +++++++++ .../codegen/v3/generators/java/JavaClientCodegen.java | 9 --------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java index 69bf6e1d3a..9666d9150e 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java @@ -60,6 +60,8 @@ public abstract class AbstractJavaCodegen extends DefaultCodegenConfig { public static final String ERROR_ON_UNKNOWN_ENUM = "errorOnUnknownEnum"; public static final String CHECK_DUPLICATED_MODEL_NAME = "checkDuplicatedModelName"; + public static final String WIREMOCK_OPTION = "wiremock"; + protected String dateLibrary = "threetenbp"; protected boolean java8Mode = false; protected boolean java11Mode = false; @@ -190,6 +192,8 @@ public AbstractJavaCodegen() { cliOptions.add(java11Mode); cliOptions.add(CliOption.newBoolean(CHECK_DUPLICATED_MODEL_NAME, "Check if there are duplicated model names (ignoring case)")); + + cliOptions.add(CliOption.newBoolean(WIREMOCK_OPTION, "Use wiremock to generate endpoint calls to mock on generated tests.")); } @Override @@ -356,6 +360,11 @@ public void processOpts() { additionalProperties.put(ERROR_ON_UNKNOWN_ENUM, errorOnUnknownEnum); } + if (additionalProperties.containsKey(WIREMOCK_OPTION)) { + final boolean useWireMock = additionalProperties.get(WIREMOCK_OPTION) != null && Boolean.parseBoolean(additionalProperties.get(WIREMOCK_OPTION).toString()); + additionalProperties.put(WIREMOCK_OPTION, useWireMock); + } + if (this instanceof NotNullAnnotationFeatures) { notNullOption = (NotNullAnnotationFeatures)this; if (additionalProperties.containsKey(NOT_NULL_JACKSON_ANNOTATION)) { diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java index c08cbf43ed..0741625f6c 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/JavaClientCodegen.java @@ -53,8 +53,6 @@ public class JavaClientCodegen extends AbstractJavaCodegen implements BeanValida public static final String RETROFIT_1 = "retrofit"; public static final String RETROFIT_2 = "retrofit2"; - public static final String WIREMOCK_OPTION = "wiremock"; - protected String gradleWrapperPackage = "gradle.wrapper"; protected boolean useRxJava = false; protected boolean useRxJava2 = false; @@ -89,8 +87,6 @@ public JavaClientCodegen() { cliOptions.add(CliOption.newBoolean(USE_GZIP_FEATURE, "Send gzip-encoded requests")); cliOptions.add(CliOption.newBoolean(USE_RUNTIME_EXCEPTION, "Use RuntimeException instead of Exception")); - cliOptions.add(CliOption.newBoolean(WIREMOCK_OPTION, "Use wiremock to generate endpoint calls to mock on generated tests.")); - supportedLibraries.put("jersey1", "HTTP client: Jersey client 1.19.4. JSON processing: Jackson 2.10.1. Enable gzip request encoding using '-DuseGzipFeature=true'."); supportedLibraries.put("feign", "HTTP client: OpenFeign 9.4.0. JSON processing: Jackson 2.10.1"); supportedLibraries.put("jersey2", "HTTP client: Jersey client 2.26. JSON processing: Jackson 2.10.1"); @@ -177,11 +173,6 @@ public void processOpts() { this.setUseRuntimeException(convertPropertyToBooleanAndWriteBack(USE_RUNTIME_EXCEPTION)); } - if (additionalProperties.containsKey(WIREMOCK_OPTION)) { - final boolean useWireMock = additionalProperties.get(WIREMOCK_OPTION) != null && Boolean.parseBoolean(additionalProperties.get(WIREMOCK_OPTION).toString()); - additionalProperties.put(WIREMOCK_OPTION, useWireMock); - } - final String invokerFolder = (sourceFolder + File.separator + invokerPackage).replace(".", File.separator); final String authFolder = (sourceFolder + File.separator + invokerPackage + ".auth").replace(".", File.separator); final String apiFolder = (sourceFolder + File.separator + apiPackage).replace(".", File.separator); From c1dbe1167242c3cee3f1bf6a251b3db1574664b7 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Wed, 23 Feb 2022 02:18:01 -0500 Subject: [PATCH 065/223] check wiremock option on templates --- .../JavaSpring/libraries/spring-cloud/apiClient.mustache | 4 +--- .../libraries/spring-cloud/application-test.mustache | 4 ++++ .../JavaSpring/libraries/spring-cloud/pom.mustache | 8 ++++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/apiClient.mustache b/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/apiClient.mustache index dc4afa0ea3..029b0030a9 100644 --- a/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/apiClient.mustache +++ b/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/apiClient.mustache @@ -8,8 +8,6 @@ import org.springframework.cloud.openfeign.FeignClient; {{/isOpenFeign}} import {{configPackage}}.ClientConfiguration; -{{=<% %>=}} -@FeignClient(<%#isOpenFeign%>contextId="<%classname%>Client", <%/isOpenFeign%>name="${<%title%>.name:<%title%>}", url="${<%title%>.url:<%basePath%>}", configuration = ClientConfiguration.class) -<%={{ }}=%> +@FeignClient({{#isOpenFeign}}contextId="{{classname}}Client", {{/isOpenFeign}}name="${{braces "left"}}{{title}}.name:{{title}}{{braces "right"}}", url="${{braces "left"}}{{title}}.url:{{^wiremock}}{{basePath}}{{/wiremock}}{{#wiremock}}wiremock.base.path{{/wiremock}}{{braces "right"}}", configuration = ClientConfiguration.class) public interface {{classname}}Client extends {{classname}} { } diff --git a/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/application-test.mustache b/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/application-test.mustache index 49e253e9ae..bb1b707127 100644 --- a/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/application-test.mustache +++ b/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/application-test.mustache @@ -9,3 +9,7 @@ hystrix.command.default.execution.timeout.enabled: false logging.level.{{apiPackage}}: DEBUG feign.hystrix.enabled: true + +{{#wiremock}} +wiremock.base.path: http://localhost:33333 +{{/wiremock}} diff --git a/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/pom.mustache b/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/pom.mustache index 3290451339..b545860edb 100644 --- a/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/pom.mustache +++ b/src/main/resources/handlebars/JavaSpring/libraries/spring-cloud/pom.mustache @@ -138,5 +138,13 @@ javax.servlet-api provided + {{#wiremock}} + + com.github.tomakehurst + wiremock + 2.27.2 + test + + {{/wiremock}} From d5c811431d3c3c08a53ebce44afd1620def86585 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Thu, 24 Feb 2022 20:12:44 -0500 Subject: [PATCH 066/223] fixed option check --- .../codegen/v3/generators/options/JavaOptionsProvider.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/io/swagger/codegen/v3/generators/options/JavaOptionsProvider.java b/src/test/java/io/swagger/codegen/v3/generators/options/JavaOptionsProvider.java index 8b8aff5a22..11d6a31817 100644 --- a/src/test/java/io/swagger/codegen/v3/generators/options/JavaOptionsProvider.java +++ b/src/test/java/io/swagger/codegen/v3/generators/options/JavaOptionsProvider.java @@ -77,6 +77,7 @@ public JavaOptionsProvider() { .put(CodegenConstants.ALLOW_UNICODE_IDENTIFIERS, ALLOW_UNICODE_IDENTIFIERS_VALUE) .put(CodegenConstants.USE_OAS2, "true") .put(JavaClientCodegen.CHECK_DUPLICATED_MODEL_NAME, "false") + .put(JavaClientCodegen.WIREMOCK_OPTION, "false") //.put("supportJava6", "true") .build(); } From 9ea84862e1cc8072df571e45e318742b0cff6e17 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Tue, 8 Mar 2022 07:41:03 -0500 Subject: [PATCH 067/223] reverted imports wrapping --- .../AbstractTypeScriptClientCodegen.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java index 77310ed1b8..74a8aedf80 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java @@ -8,7 +8,19 @@ import io.swagger.codegen.v3.ISchemaHandler; import io.swagger.codegen.v3.generators.DefaultCodegenConfig; import io.swagger.codegen.v3.generators.util.OpenAPIUtil; -import io.swagger.v3.oas.models.media.*; +import io.swagger.v3.oas.models.media.ArraySchema; +import io.swagger.v3.oas.models.media.BooleanSchema; +import io.swagger.v3.oas.models.media.BinarySchema; +import io.swagger.v3.oas.models.media.ComposedSchema; +import io.swagger.v3.oas.models.media.DateSchema; +import io.swagger.v3.oas.models.media.DateTimeSchema; +import io.swagger.v3.oas.models.media.FileSchema; +import io.swagger.v3.oas.models.media.IntegerSchema; +import io.swagger.v3.oas.models.media.MapSchema; +import io.swagger.v3.oas.models.media.NumberSchema; +import io.swagger.v3.oas.models.media.ObjectSchema; +import io.swagger.v3.oas.models.media.Schema; +import io.swagger.v3.oas.models.media.StringSchema; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From b95e6771431cedce967897945bc1868e47b2f6af Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Tue, 8 Mar 2022 07:41:27 -0500 Subject: [PATCH 068/223] fixed build errors on api files --- .../typescript-axios/apiInner.mustache | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/src/main/resources/handlebars/typescript-axios/apiInner.mustache b/src/main/resources/handlebars/typescript-axios/apiInner.mustache index ba324344cb..5da3a5cad5 100644 --- a/src/main/resources/handlebars/typescript-axios/apiInner.mustache +++ b/src/main/resources/handlebars/typescript-axios/apiInner.mustache @@ -26,17 +26,17 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur * @summary {{&summary}} {{/summary}} {{#parameters}} - * @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} + * @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} {{/parameters}} * @param {*} [options] Override http request option. * @throws {RequiredError} */ - {{nickname}}: async ({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options: AxiosRequestConfig = {}): Promise => { + {{nickname}}{{#isForm}}Form{{/isForm}}: async ({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options: AxiosRequestConfig = {}): Promise => { {{#parameters}} {{#required}} // verify required parameter '{{paramName}}' is not null or undefined if ({{paramName}} === null || {{paramName}} === undefined) { - throw new RequiredError('{{paramName}}','Required parameter {{paramName}} was null or undefined when calling {{nickname}}.'); + throw new RequiredError('{{paramName}}','Required parameter {{paramName}} was null or undefined when calling {{nickname}}{{#isForm}}Form{{/isForm}}.'); } {{/required}} {{/parameters}} @@ -151,6 +151,7 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur {{/headerParams}} {{#vendorExtensions}} + {{#isForm}} {{#formParams}} {{#isListContainer}} if ({{paramName}}) { @@ -170,11 +171,12 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur localVarFormParams.append('{{baseName}}', {{paramName}} as any);{{/multipartFormData}} } {{/isListContainer}} - {{/formParams}}{{/vendorExtensions}} - {{#vendorExtensions}}{{#hasFormParams}}{{^multipartFormData}} + {{/formParams}}{{/isForm}}{{/vendorExtensions}} + {{#vendorExtensions}}{{#isForm}}{{#hasFormParams}}{{^multipartFormData}} localVarHeaderParameter['Content-Type'] = 'application/x-www-form-urlencoded';{{/multipartFormData}}{{#multipartFormData}} localVarHeaderParameter['Content-Type'] = 'multipart/form-data';{{/multipartFormData}} - {{/hasFormParams}}{{/vendorExtensions}} + {{/hasFormParams}}{{/isForm}}{{/vendorExtensions}} + {{^isForm}} {{#bodyParam}} {{^consumes}} localVarHeaderParameter['Content-Type'] = 'application/json'; @@ -184,6 +186,7 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur {{/consumes.0}} {{/bodyParam}} + {{/isForm}} const query = new URLSearchParams(localVarUrlObj.search); for (const key in localVarQueryParameter) { query.set(key, localVarQueryParameter[key]); @@ -194,13 +197,17 @@ export const {{classname}}AxiosParamCreator = function (configuration?: Configur localVarUrlObj.search = (new URLSearchParams(query)).toString(); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + {{#isForm}} {{#hasFormParams}} localVarRequestOptions.data = localVarFormParams{{#vendorExtensions}}{{^multipartFormData}}.toString(){{/multipartFormData}}{{/vendorExtensions}}; {{/hasFormParams}} + {{/isForm}} + {{^isForm}} {{#bodyParam}} const needsSerialization = (typeof {{paramName}} !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json'; localVarRequestOptions.data = needsSerialization ? JSON.stringify({{paramName}} !== undefined ? {{paramName}} : {}) : ({{paramName}} || ""); {{/bodyParam}} + {{/isForm}} return { url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash, @@ -227,13 +234,13 @@ export const {{classname}}Fp = function(configuration?: Configuration) { * @summary {{&summary}} {{/summary}} {{#parameters}} - * @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} + * @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} {{/parameters}} * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise>> { - const localVarAxiosArgs = await {{classname}}AxiosParamCreator(configuration).{{nickname}}({{#parameters}}{{paramName}}, {{/parameters}}options); + async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise>> { + const localVarAxiosArgs = await {{classname}}AxiosParamCreator(configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}options); return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => { const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url}; return axios.request(axiosRequestArgs); @@ -259,13 +266,13 @@ export const {{classname}}Factory = function (configuration?: Configuration, bas * @summary {{&summary}} {{/summary}} {{#parameters}} - * @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} + * @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} {{/parameters}} * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise> { - return {{classname}}Fp(configuration).{{nickname}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(axios, basePath)); + async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise> { + return {{classname}}Fp(configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(axios, basePath)); }, {{/contents}} {{/operation}} @@ -288,13 +295,13 @@ export interface {{classname}}Interface { * @summary {{&summary}} {{/summary}} {{#parameters}} - * @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} + * @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} {{/parameters}} * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof {{classname}}Interface */ - async {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise>; + async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig): Promise>; {{/contents}} {{/operation}} @@ -322,14 +329,14 @@ export class {{classname}} extends BaseAPI { * @summary {{&summary}} {{/summary}} {{#parameters}} - * @param {{braces "left"}}{{dataType}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} + * @param {{braces "left"}}{{{dataType}}}{{braces "right"}} {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}} {{/parameters}} * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof {{classname}} */ - public async {{nickname}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig) : Promise> { - return {{classname}}Fp(this.configuration).{{nickname}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(this.axios, this.basePath)); + public async {{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}, {{/parameters}}options?: AxiosRequestConfig) : Promise> { + return {{classname}}Fp(this.configuration).{{nickname}}{{#isForm}}Form{{/isForm}}({{#parameters}}{{paramName}}, {{/parameters}}options).then((request) => request(this.axios, this.basePath)); } {{^@last}} From f0e2f970963615ebd76d5ec92c7651d05f7ac69d Mon Sep 17 00:00:00 2001 From: Andre Wachsmuth Date: Thu, 10 Mar 2022 22:32:39 +0100 Subject: [PATCH 069/223] [Java/Feigh] Don't HTML escape Accept / Content-Type header When e.g. the Accept-Header contains special characters such as `=`, mustache escapes them, which results in code like this to be generated: ```java // MyApi.java public interface MyApi extends ApiClient.Api { @RequestLine("GET /rest/protected/items?size={size}&page={page}") @Headers({ "Content-Type: */*", "Accept: application/com.example+json; version=1.0; charset=utf-8,application/com.example+xml; version=1.0; charset=utf-8,application/json; charset=utf-8,application/xml; charset=utf-8", }) LicenseListResource getLicenses(@QueryMap(encoded=true) Map queryParams); } ``` Note the `Accept: application/com.example+json; version=1.0; charset=utf-8` with the escaped `=`, which does not work. This disables HTML escaping for the header values. On a side note though, I had been wondering whether HTML escaping makes sense when generating Java files? It does in JavaDocs I suppose, but shouldn't it be disabled everywhere else? --- .../handlebars/Java/libraries/feign/api.mustache | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/handlebars/Java/libraries/feign/api.mustache b/src/main/resources/handlebars/Java/libraries/feign/api.mustache index ccefd3fcb3..4b7bd85243 100644 --- a/src/main/resources/handlebars/Java/libraries/feign/api.mustache +++ b/src/main/resources/handlebars/Java/libraries/feign/api.mustache @@ -40,10 +40,10 @@ public interface {{classname}} extends ApiClient.Api { @RequestLine("{{httpMethod}} {{{path}}}{{#hasQueryParams}}?{{/hasQueryParams}}{{#queryParams}}{{baseName}}={{braces "left"}}{{paramName}}{{braces "right"}}{{#has this 'more'}}&{{/has}}{{/queryParams}}") @Headers({ {{#vendorExtensions.x-contentType}} - "Content-Type: {{vendorExtensions.x-contentType}}", + "Content-Type: {{{vendorExtensions.x-contentType}}}", {{/vendorExtensions.x-contentType}} {{#vendorExtensions.x-accepts}} - "Accept: {{vendorExtensions.x-accepts}}", + "Accept: {{{vendorExtensions.x-accepts}}}", {{/vendorExtensions.x-accepts}} {{^vendorExtensions.x-accepts}} "Accept: */*", @@ -85,13 +85,13 @@ public interface {{classname}} extends ApiClient.Api { @RequestLine("{{httpMethod}} {{{path}}}?{{#queryParams}}{{baseName}}={{braces "left"}}{{paramName}}{{braces "right"}}{{#has this 'more'}}&{{/has}}{{/queryParams}}") @Headers({ {{#vendorExtensions.x-contentType}} - "Content-Type: {{vendorExtensions.x-contentType}}", + "Content-Type: {{{vendorExtensions.x-contentType}}}", {{/vendorExtensions.x-contentType}} {{^vendorExtensions.x-contentType}} "Content-Type: */*", {{/vendorExtensions.x-contentType}} {{#vendorExtensions.x-accepts}} - "Accept: {{vendorExtensions.x-accepts}}", + "Accept: {{{vendorExtensions.x-accepts}}}", {{/vendorExtensions.x-accepts}} {{#headerParams}} "{{baseName}}: {{braces "left"}}{{paramName}}{{braces "right"}}"{{#has this 'more'}},{{/has}} From 382ecc1bcf9f32a20ded823dd3c07a881cc9148d Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Thu, 17 Mar 2022 19:19:00 -0500 Subject: [PATCH 070/223] run swagger-ui on flask generated project --- .../handlebars/pythonFlaskConnexion/controller_test.mustache | 4 ++++ .../handlebars/pythonFlaskConnexion/requirements.mustache | 4 +++- .../resources/handlebars/pythonFlaskConnexion/setup.mustache | 5 ++++- .../resources/handlebars/pythonFlaskConnexion/tox.mustache | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/resources/handlebars/pythonFlaskConnexion/controller_test.mustache b/src/main/resources/handlebars/pythonFlaskConnexion/controller_test.mustache index 2f3b4c4148..960a28521e 100644 --- a/src/main/resources/handlebars/pythonFlaskConnexion/controller_test.mustache +++ b/src/main/resources/handlebars/pythonFlaskConnexion/controller_test.mustache @@ -14,6 +14,8 @@ class {{#operations}}Test{{classname}}(BaseTestCase): """{{classname}} integration test stubs""" {{#operation}} + {{#contents}} + {{#@first}} def test_{{operationId}}(self): """Test case for {{{operationId}}} @@ -43,6 +45,8 @@ class {{#operations}}Test{{classname}}(BaseTestCase): self.assert200(response, 'Response body is : ' + response.data.decode('utf-8')) + {{/@first}} + {{/contents}} {{/operation}} {{/operations}} diff --git a/src/main/resources/handlebars/pythonFlaskConnexion/requirements.mustache b/src/main/resources/handlebars/pythonFlaskConnexion/requirements.mustache index fe63fe39d9..235a01920c 100644 --- a/src/main/resources/handlebars/pythonFlaskConnexion/requirements.mustache +++ b/src/main/resources/handlebars/pythonFlaskConnexion/requirements.mustache @@ -1,6 +1,8 @@ -connexion == 2.6.0 +connexion >= 2.6.0 +connexion[swagger-ui] >= 2.6.0 python_dateutil == 2.6.0 {{#supportPython2}} typing == 3.5.2.2 {{/supportPython2}} setuptools >= 21.0.0 +swagger-ui-bundle >= 0.0.2 diff --git a/src/main/resources/handlebars/pythonFlaskConnexion/setup.mustache b/src/main/resources/handlebars/pythonFlaskConnexion/setup.mustache index 56f8bc1ec1..2ee76bdd08 100644 --- a/src/main/resources/handlebars/pythonFlaskConnexion/setup.mustache +++ b/src/main/resources/handlebars/pythonFlaskConnexion/setup.mustache @@ -13,7 +13,10 @@ VERSION = "{{packageVersion}}" # prerequisite: setuptools # http://pypi.python.org/pypi/setuptools -REQUIRES = ["connexion"] +REQUIRES = [ + "connexion", + "swagger-ui-bundle>=0.0.2" +] setup( name=NAME, diff --git a/src/main/resources/handlebars/pythonFlaskConnexion/tox.mustache b/src/main/resources/handlebars/pythonFlaskConnexion/tox.mustache index 3efa994317..c85cae3473 100644 --- a/src/main/resources/handlebars/pythonFlaskConnexion/tox.mustache +++ b/src/main/resources/handlebars/pythonFlaskConnexion/tox.mustache @@ -1,5 +1,5 @@ [tox] -envlist = {{#supportPython2}}py27, {{/supportPython2}}py35 +envlist = {{#supportPython2}}py27, {{/supportPython2}}py38 [testenv] deps=-r{toxinidir}/requirements.txt From e1297502b33926b10965abed75e7dde5c520d413 Mon Sep 17 00:00:00 2001 From: frantuma Date: Tue, 12 Apr 2022 19:26:24 +0200 Subject: [PATCH 071/223] bump jackson version --- pom.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d184a99955..688d4b5051 100644 --- a/pom.xml +++ b/pom.xml @@ -120,7 +120,7 @@ com.fasterxml.jackson.core jackson-databind - ${jackson-version} + ${jackson-databind-version} com.fasterxml.jackson.core @@ -257,7 +257,12 @@ 3.0.34-SNAPSHOT 2.0.30 2.1.13 - 2.12.1 + 2.13.2 + + 2.13.2.2 2.11.1 3.3.0 2.11.0 From f46633e2e0ba651fd1b9e67b6aadcad62078af8b Mon Sep 17 00:00:00 2001 From: frantuma Date: Tue, 12 Apr 2022 20:12:08 +0200 Subject: [PATCH 072/223] prepare release 1.0.34 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 688d4b5051..e2324abe0b 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.swagger.codegen.v3 swagger-codegen-generators - 1.0.34-SNAPSHOT + 1.0.34 jar @@ -254,7 +254,7 @@ - 3.0.34-SNAPSHOT + 3.0.34 2.0.30 2.1.13 2.13.2 From 149347ceb1827004cdb2b5093be48535a7c70528 Mon Sep 17 00:00:00 2001 From: frantuma Date: Wed, 13 Apr 2022 21:30:08 +0200 Subject: [PATCH 073/223] next snapshot 1.0.35-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e2324abe0b..47c71a9b2e 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.swagger.codegen.v3 swagger-codegen-generators - 1.0.34 + 1.0.35-SNAPSHOT jar From 56bf0942d7510e50f6511ee1eb214038e98611ce Mon Sep 17 00:00:00 2001 From: frantuma Date: Wed, 13 Apr 2022 21:40:16 +0200 Subject: [PATCH 074/223] bump codegen to 3.0.35-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 47c71a9b2e..67cbe3ff28 100644 --- a/pom.xml +++ b/pom.xml @@ -254,7 +254,7 @@ - 3.0.34 + 3.0.35-SNAPSHOT 2.0.30 2.1.13 2.13.2 From a0b69e0cde6ce2fde9e0b4daba0677dbdfbfe74e Mon Sep 17 00:00:00 2001 From: Oleksii Prudkyi Date: Sat, 23 Apr 2022 01:03:49 +0300 Subject: [PATCH 075/223] [php] support guzzlehttp/guzzle ^7.0 --- src/main/resources/handlebars/php/api.mustache | 4 ++-- src/main/resources/handlebars/php/composer.mustache | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/handlebars/php/api.mustache b/src/main/resources/handlebars/php/api.mustache index 0b1cfddc1f..428a38677e 100644 --- a/src/main/resources/handlebars/php/api.mustache +++ b/src/main/resources/handlebars/php/api.mustache @@ -448,7 +448,7 @@ use {{invokerPackage}}\ObjectSerializer; } else { // for HTTP post (form) - $httpBody = \GuzzleHttp\Psr7\build_query($formParams); + $httpBody = \GuzzleHttp\Psr7\Query::build($formParams); } } @@ -491,7 +491,7 @@ use {{invokerPackage}}\ObjectSerializer; $headers ); - $query = \GuzzleHttp\Psr7\build_query($queryParams); + $query = \GuzzleHttp\Psr7\Query::build($queryParams); return new Request( '{{httpMethod}}', $this->config->getHost() . $resourcePath . ($query ? "?{$query}" : ''), diff --git a/src/main/resources/handlebars/php/composer.mustache b/src/main/resources/handlebars/php/composer.mustache index 0a7732fafe..0408255dab 100644 --- a/src/main/resources/handlebars/php/composer.mustache +++ b/src/main/resources/handlebars/php/composer.mustache @@ -23,7 +23,7 @@ "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "guzzlehttp/guzzle": "^6.2" + "guzzlehttp/guzzle": "^6.2|^7.0" }, "require-dev": { "phpunit/phpunit": "^4.8", From 32a2a8cab28b14280fd9fdfb5f29165610c1ae26 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Wed, 13 Jul 2022 03:01:53 -0500 Subject: [PATCH 076/223] fixed one of file generated issue. Use the declared composed schema as interface for java generators --- .../codegen/v3/generators/SchemaHandler.java | 25 +++++++++++++++++++ .../JavaJaxRS/resteasy/interface.mustache | 18 ++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/SchemaHandler.java b/src/main/java/io/swagger/codegen/v3/generators/SchemaHandler.java index e4e908f579..a2eb36c9af 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/SchemaHandler.java +++ b/src/main/java/io/swagger/codegen/v3/generators/SchemaHandler.java @@ -70,6 +70,18 @@ public List getModels() { } protected CodegenModel processComposedSchema(CodegenModel codegenModel, ComposedSchema composedSchema, Map allModels) { + + final boolean schemaWithNoProperties = codegenModel.vars == null || codegenModel.vars.isEmpty(); + if (schemaWithNoProperties) { + if (composedSchema.getOneOf() != null && !composedSchema.getOneOf().isEmpty()) { + this.addInterfaces(composedSchema.getOneOf(), codegenModel, allModels); + } else if (composedSchema.getAnyOf() != null && !composedSchema.getAnyOf().isEmpty()) { + this.addInterfaces(composedSchema.getAnyOf(), codegenModel, allModels); + } + codegenModel.setIsComposedModel(true); + return codegenModel; + } + List schemas = composedSchema.getOneOf(); CodegenModel composedModel = this.createComposedModel(ONE_OF_PREFFIX + codegenModel.getName(), schemas); if (composedModel == null) { @@ -186,6 +198,19 @@ protected void addInterfaces(List schemas, CodegenModel codegenModel, Ma if (!subTypeAdded) { codegenModel.addSubType(model); } + + if (codegenModel.getVendorExtensions() == null || codegenModel.getVendorExtensions().containsKey("x-discriminator-type")) { + continue; + } + if (codegenModel.getDiscriminator() != null && StringUtils.isNotBlank(codegenModel.getDiscriminator().getPropertyName())) { + Optional optionalProperty = model.vars.stream() + .filter(codegenProperty -> codegenProperty.baseName.equals(codegenModel.getDiscriminator().getPropertyName())).findFirst(); + + optionalProperty.ifPresent(codegenProperty -> { + codegenModel.getVendorExtensions().put("x-discriminator-type", codegenProperty.datatypeWithEnum); + codegenModel.getVendorExtensions().put("x-discriminator-type-getter", codegenConfig.toGetter(codegenModel.getDiscriminator().getPropertyName())); + }); + } } } diff --git a/src/main/resources/handlebars/JavaJaxRS/resteasy/interface.mustache b/src/main/resources/handlebars/JavaJaxRS/resteasy/interface.mustache index becc0c5549..2ee7870910 100644 --- a/src/main/resources/handlebars/JavaJaxRS/resteasy/interface.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/resteasy/interface.mustache @@ -1,6 +1,22 @@ +{{#jackson}} +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; // +{{/jackson}} /** * {{#description}}{{.}}{{/description}}{{^description}}{{classname}}{{/description}} */ +{{#jackson}} +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{#discriminator}}{{#propertyName}}{{propertyName}}{{/propertyName}}{{^propertyName}}type{{/propertyName}}{{/discriminator}}{{^discriminator}}type{{/discriminator}}") + @JsonSubTypes({ + {{#subTypes}} + @JsonSubTypes.Type(value = {{classname}}.class, name = "{{classname}}"){{^@last}},{{/@last}} + {{/subTypes}} +}) +{{/jackson}} public interface {{{classname}}} { - +{{#vendorExtensions}} +{{#x-discriminator-type-getter}} + {{x-discriminator-type}} {{x-discriminator-type-getter}}(); +{{/x-discriminator-type-getter}} +{{/vendorExtensions}} } From 6f425afb68b36bb81327e7832bee1d5f953a57b5 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Sun, 17 Jul 2022 08:02:56 -0500 Subject: [PATCH 077/223] updated `interface.mustache` templates in java generators --- src/main/resources/handlebars/Java/interface.mustache | 5 +++++ .../resources/handlebars/JavaInflector/interface.mustache | 5 +++++ .../handlebars/JavaJaxRS/cxf-cdi/interface.mustache | 5 +++++ .../resources/handlebars/JavaJaxRS/cxf/interface.mustache | 5 +++++ src/main/resources/handlebars/JavaJaxRS/interface.mustache | 5 +++++ .../handlebars/JavaJaxRS/resteasy/eap/interface.mustache | 5 +++++ .../resources/handlebars/JavaJaxRS/spec/interface.mustache | 5 +++++ src/main/resources/handlebars/JavaSpring/interface.mustache | 5 +++++ 8 files changed, 40 insertions(+) diff --git a/src/main/resources/handlebars/Java/interface.mustache b/src/main/resources/handlebars/Java/interface.mustache index bd8ff9a735..0d08bbe545 100644 --- a/src/main/resources/handlebars/Java/interface.mustache +++ b/src/main/resources/handlebars/Java/interface.mustache @@ -18,4 +18,9 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; {{/jackson}} public interface {{{classname}}} { +{{#vendorExtensions}} +{{#x-discriminator-type-getter}} + {{x-discriminator-type}} {{x-discriminator-type-getter}}(); +{{/x-discriminator-type-getter}} +{{/vendorExtensions}} } diff --git a/src/main/resources/handlebars/JavaInflector/interface.mustache b/src/main/resources/handlebars/JavaInflector/interface.mustache index becc0c5549..abec32f768 100644 --- a/src/main/resources/handlebars/JavaInflector/interface.mustache +++ b/src/main/resources/handlebars/JavaInflector/interface.mustache @@ -3,4 +3,9 @@ */ public interface {{{classname}}} { +{{#vendorExtensions}} +{{#x-discriminator-type-getter}} + {{x-discriminator-type}} {{x-discriminator-type-getter}}(); +{{/x-discriminator-type-getter}} +{{/vendorExtensions}} } diff --git a/src/main/resources/handlebars/JavaJaxRS/cxf-cdi/interface.mustache b/src/main/resources/handlebars/JavaJaxRS/cxf-cdi/interface.mustache index becc0c5549..abec32f768 100644 --- a/src/main/resources/handlebars/JavaJaxRS/cxf-cdi/interface.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/cxf-cdi/interface.mustache @@ -3,4 +3,9 @@ */ public interface {{{classname}}} { +{{#vendorExtensions}} +{{#x-discriminator-type-getter}} + {{x-discriminator-type}} {{x-discriminator-type-getter}}(); +{{/x-discriminator-type-getter}} +{{/vendorExtensions}} } diff --git a/src/main/resources/handlebars/JavaJaxRS/cxf/interface.mustache b/src/main/resources/handlebars/JavaJaxRS/cxf/interface.mustache index becc0c5549..abec32f768 100644 --- a/src/main/resources/handlebars/JavaJaxRS/cxf/interface.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/cxf/interface.mustache @@ -3,4 +3,9 @@ */ public interface {{{classname}}} { +{{#vendorExtensions}} +{{#x-discriminator-type-getter}} + {{x-discriminator-type}} {{x-discriminator-type-getter}}(); +{{/x-discriminator-type-getter}} +{{/vendorExtensions}} } diff --git a/src/main/resources/handlebars/JavaJaxRS/interface.mustache b/src/main/resources/handlebars/JavaJaxRS/interface.mustache index becc0c5549..abec32f768 100644 --- a/src/main/resources/handlebars/JavaJaxRS/interface.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/interface.mustache @@ -3,4 +3,9 @@ */ public interface {{{classname}}} { +{{#vendorExtensions}} +{{#x-discriminator-type-getter}} + {{x-discriminator-type}} {{x-discriminator-type-getter}}(); +{{/x-discriminator-type-getter}} +{{/vendorExtensions}} } diff --git a/src/main/resources/handlebars/JavaJaxRS/resteasy/eap/interface.mustache b/src/main/resources/handlebars/JavaJaxRS/resteasy/eap/interface.mustache index becc0c5549..abec32f768 100644 --- a/src/main/resources/handlebars/JavaJaxRS/resteasy/eap/interface.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/resteasy/eap/interface.mustache @@ -3,4 +3,9 @@ */ public interface {{{classname}}} { +{{#vendorExtensions}} +{{#x-discriminator-type-getter}} + {{x-discriminator-type}} {{x-discriminator-type-getter}}(); +{{/x-discriminator-type-getter}} +{{/vendorExtensions}} } diff --git a/src/main/resources/handlebars/JavaJaxRS/spec/interface.mustache b/src/main/resources/handlebars/JavaJaxRS/spec/interface.mustache index becc0c5549..abec32f768 100644 --- a/src/main/resources/handlebars/JavaJaxRS/spec/interface.mustache +++ b/src/main/resources/handlebars/JavaJaxRS/spec/interface.mustache @@ -3,4 +3,9 @@ */ public interface {{{classname}}} { +{{#vendorExtensions}} +{{#x-discriminator-type-getter}} + {{x-discriminator-type}} {{x-discriminator-type-getter}}(); +{{/x-discriminator-type-getter}} +{{/vendorExtensions}} } diff --git a/src/main/resources/handlebars/JavaSpring/interface.mustache b/src/main/resources/handlebars/JavaSpring/interface.mustache index bd8ff9a735..0d08bbe545 100644 --- a/src/main/resources/handlebars/JavaSpring/interface.mustache +++ b/src/main/resources/handlebars/JavaSpring/interface.mustache @@ -18,4 +18,9 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; {{/jackson}} public interface {{{classname}}} { +{{#vendorExtensions}} +{{#x-discriminator-type-getter}} + {{x-discriminator-type}} {{x-discriminator-type-getter}}(); +{{/x-discriminator-type-getter}} +{{/vendorExtensions}} } From 1db390b1146470484a677a3670b4f04262291121 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Wed, 20 Jul 2022 21:24:12 -0500 Subject: [PATCH 078/223] avoid allOf schema be converted into interfaces --- .../java/io/swagger/codegen/v3/generators/SchemaHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/SchemaHandler.java b/src/main/java/io/swagger/codegen/v3/generators/SchemaHandler.java index a2eb36c9af..09f0e13cd9 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/SchemaHandler.java +++ b/src/main/java/io/swagger/codegen/v3/generators/SchemaHandler.java @@ -72,7 +72,7 @@ public List getModels() { protected CodegenModel processComposedSchema(CodegenModel codegenModel, ComposedSchema composedSchema, Map allModels) { final boolean schemaWithNoProperties = codegenModel.vars == null || codegenModel.vars.isEmpty(); - if (schemaWithNoProperties) { + if (schemaWithNoProperties && (composedSchema.getAllOf() == null || composedSchema.getAllOf().isEmpty())) { if (composedSchema.getOneOf() != null && !composedSchema.getOneOf().isEmpty()) { this.addInterfaces(composedSchema.getOneOf(), codegenModel, allModels); } else if (composedSchema.getAnyOf() != null && !composedSchema.getAnyOf().isEmpty()) { From 2cd0f00f46f36e49b45d154cad3695caacbc4f5b Mon Sep 17 00:00:00 2001 From: frantuma Date: Thu, 21 Jul 2022 16:21:08 +0200 Subject: [PATCH 079/223] refs swagger-api/swagger-codegen#10496 - fix null type handling --- .../codegen/v3/generators/dotnet/AbstractCSharpCodegen.java | 2 +- .../typescript/AbstractTypeScriptClientCodegen.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/dotnet/AbstractCSharpCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/dotnet/AbstractCSharpCodegen.java index 4e3f2665fc..8b846d9a36 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/dotnet/AbstractCSharpCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/dotnet/AbstractCSharpCodegen.java @@ -755,7 +755,7 @@ public String getSchemaType(Schema propertySchema) { String type; if (swaggerType == null) { - swaggerType = StringUtils.EMPTY; // set swagger type to empty string if null + swaggerType = "object"; } // TODO avoid using toLowerCase as typeMapping should be case-sensitive diff --git a/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java index 74a8aedf80..ee78d80526 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/typescript/AbstractTypeScriptClientCodegen.java @@ -307,6 +307,10 @@ public String toDefaultValue(Schema propertySchema) { @Override public String getSchemaType(Schema schema) { String swaggerType = super.getSchemaType(schema); + if (swaggerType == null) { + // default to object, see #10496 + swaggerType = "object"; + } if (schema instanceof ComposedSchema) { ComposedSchema composedSchema = (ComposedSchema)schema; if (composedSchema.getAllOf() != null && !composedSchema.getAllOf().isEmpty()) { From 709851b3920f6e7ec3ec7373ce711eeba3089edf Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Tue, 26 Jul 2022 14:47:17 -0500 Subject: [PATCH 080/223] changed jackson provider dependency to work with fastxml instead of codehause --- .../resources/handlebars/Java/libraries/resteasy/pom.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/handlebars/Java/libraries/resteasy/pom.mustache b/src/main/resources/handlebars/Java/libraries/resteasy/pom.mustache index c1184d52aa..9fe63eb110 100644 --- a/src/main/resources/handlebars/Java/libraries/resteasy/pom.mustache +++ b/src/main/resources/handlebars/Java/libraries/resteasy/pom.mustache @@ -211,7 +211,7 @@ {{/supportJava6}} org.jboss.resteasy - resteasy-jackson-provider + resteasy-jackson2-provider 3.1.3.Final From ef1cd3a50c38f30c9fa73e82fc21f0688413423d Mon Sep 17 00:00:00 2001 From: PippoBaudoCorporation Date: Tue, 2 Aug 2022 13:33:47 +0200 Subject: [PATCH 081/223] Update AbstractJavaJAXRSServerCodegen.java the generation of the code will fail on windows beacause the separator is \ using File.separatorChar is fine for both os --- .../v3/generators/java/AbstractJavaJAXRSServerCodegen.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaJAXRSServerCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaJAXRSServerCodegen.java index f0dc44eb4c..1190ef0d73 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaJAXRSServerCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaJAXRSServerCodegen.java @@ -22,6 +22,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.io.File; import static io.swagger.codegen.v3.generators.handlebars.ExtensionHelper.getBooleanValue; @@ -224,11 +225,11 @@ public String apiFilename(String templateName, String tag) { String result = super.apiFilename(templateName, tag); if ( templateName.endsWith("Impl.mustache") ) { - int ix = result.lastIndexOf('/'); + int ix = result.lastIndexOf(File.separatorChar); result = result.substring(0, ix) + "/impl" + result.substring(ix, result.length() - 5) + "ServiceImpl.java"; result = result.replace(apiFileFolder(), implFileFolder(implFolder)); } else if ( templateName.endsWith("Factory.mustache") ) { - int ix = result.lastIndexOf('/'); + int ix = result.lastIndexOf(File.separatorChar); result = result.substring(0, ix) + "/factories" + result.substring(ix, result.length() - 5) + "ServiceFactory.java"; result = result.replace(apiFileFolder(), implFileFolder(implFolder)); } else if ( templateName.endsWith("Service.mustache") ) { From 4fb30cf22294561fbe50067f63a82e7c8ee53f23 Mon Sep 17 00:00:00 2001 From: frantuma Date: Mon, 15 Aug 2022 15:04:57 +0200 Subject: [PATCH 082/223] prepare release 1.0.35 --- pom.xml | 8 ++++---- .../codegen/v3/generators/java/JavaModelEnumTest.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 67cbe3ff28..a042af24c8 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ io.swagger.codegen.v3 swagger-codegen-generators - 1.0.35-SNAPSHOT + 1.0.35 jar @@ -254,9 +254,9 @@ - 3.0.35-SNAPSHOT - 2.0.30 - 2.1.13 + 3.0.35 + 2.1.2 + 2.2.2 2.13.2 - + {{#generatePropertyChanged}} From a06b92d552e3ddbc485ce5b2cb64cec2a9766545 Mon Sep 17 00:00:00 2001 From: AttilaW Date: Sun, 25 Sep 2022 09:17:54 +0200 Subject: [PATCH 089/223] fixing Issue #1066 - added unit test to prove the failure and the code fix --- .../generators/java/AbstractJavaCodegen.java | 6 +- .../java/AbstractJavaCodegenTest.java | 68 +++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java index 9666d9150e..32a369a59c 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java @@ -1033,10 +1033,11 @@ protected void fixUpParentAndInterfaces(CodegenModel codegenModel, Map(); + + CodegenProperty parentValueProperty1 = new CodegenProperty(); + parentValueProperty1.name = "value"; + parentValueProperty1.baseName = "value"; + parentValueProperty1.getter = "getValue"; + parentValueProperty1.setter = "setValue"; + parentValueProperty1.datatype = "value_type"; + CodegenProperty parentValueProperty2 = new CodegenProperty(); + parentValueProperty2.name = "other_value"; + parentValueProperty2.baseName = "other_value"; + parentValueProperty2.getter = "getOtherValue"; + parentValueProperty2.setter = "setOtherValue"; + parentValueProperty2.datatype = "other_type"; + parentModel.vars = new ArrayList<>(); + parentModel.vars.add(parentValueProperty1); + parentModel.vars.add(parentValueProperty2); + + CodegenProperty childValueProperty1 = new CodegenProperty(); + childValueProperty1.name = "third_value"; + childValueProperty1.baseName = "third_value"; + childValueProperty1.nameInCamelCase = "ThirdValue"; + childValueProperty1.getter = "getThirdValue"; + childValueProperty1.setter = "setThirdValue"; + childValueProperty1.datatype = "other_type"; + CodegenProperty childValueProperty2 = new CodegenProperty(); + childValueProperty2.name = "value"; // same as parent "value" + childValueProperty2.baseName = "value"; + childValueProperty2.getter = "getValue"; // same as parent "getValue" + childValueProperty2.setter = "setValue"; // same as parent "setValue" + childValueProperty2.datatype = "different_type"; // different to parent "value_type" + + childModel.vars = new ArrayList<>(); + childModel.vars.add(childValueProperty1); + childModel.vars.add(childValueProperty2); + + Map allModels = new HashMap<>(); + allModels.put(parentModel.name, parentModel); + allModels.put(childModel.name, childModel); + + codegen.fixUpParentAndInterfaces(childModel, Collections.EMPTY_MAP); + Assert.assertEquals(childModel.vars.get(1).baseName, "value"); + Assert.assertEquals(childModel.vars.get(1).name, "childTypeValue"); + Assert.assertEquals(childModel.vars.get(1).nameInCamelCase, "ChildTypeValue"); + Assert.assertEquals(childModel.vars.get(1).getter, "getChildTypeValue"); + Assert.assertEquals(childModel.vars.get(1).setter, "setChildTypeValue"); + + // unchanged + Assert.assertEquals(childModel.vars.get(0).baseName, childValueProperty1.baseName); + Assert.assertEquals(childModel.vars.get(0).name, childValueProperty1.name); + Assert.assertEquals(childModel.vars.get(0).nameInCamelCase, childValueProperty1.nameInCamelCase); + Assert.assertEquals(childModel.vars.get(0).getter, childValueProperty1.getter); + Assert.assertEquals(childModel.vars.get(0).setter, childValueProperty1.setter); + } public static class P_AbstractJavaCodegen extends AbstractJavaCodegen { @Override From e24fda5cbb8357399ce27ae2df15aa1a3a2e1c1a Mon Sep 17 00:00:00 2001 From: AttilaW Date: Sun, 25 Sep 2022 17:38:22 +0200 Subject: [PATCH 090/223] remove tabs and replace with spaces --- .../java/AbstractJavaCodegenTest.java | 136 +++++++++--------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/src/test/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegenTest.java b/src/test/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegenTest.java index 80b20aff8a..4adb76c9d0 100644 --- a/src/test/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegenTest.java +++ b/src/test/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegenTest.java @@ -288,74 +288,74 @@ public void testFixUpParentAndInterfaces_propertyNameSame_getterSetterSame_typeD Assert.assertEquals(childModel.vars.get(1).getter, childValueProperty2.getter); Assert.assertEquals(childModel.vars.get(1).setter, childValueProperty2.setter); } - - /** - * Issue #1066 - testing case when the conflicting property is actually not the first one but the - * second - */ - @Test - public void testFixUpParentAndInterfaces_2ndproperty_propertyNameSame_getterSetterSame_typeDifferent() { - AbstractJavaCodegen codegen = new P_AbstractJavaCodegen(); - - CodegenModel parentModel = new CodegenModel(); - parentModel.name = "parent_type"; - CodegenModel childModel = new CodegenModel(); - childModel.name = "child_type"; - childModel.parentModel = parentModel; - parentModel.children = new ArrayList<>(); - - CodegenProperty parentValueProperty1 = new CodegenProperty(); - parentValueProperty1.name = "value"; - parentValueProperty1.baseName = "value"; - parentValueProperty1.getter = "getValue"; - parentValueProperty1.setter = "setValue"; - parentValueProperty1.datatype = "value_type"; - CodegenProperty parentValueProperty2 = new CodegenProperty(); - parentValueProperty2.name = "other_value"; - parentValueProperty2.baseName = "other_value"; - parentValueProperty2.getter = "getOtherValue"; - parentValueProperty2.setter = "setOtherValue"; - parentValueProperty2.datatype = "other_type"; - parentModel.vars = new ArrayList<>(); - parentModel.vars.add(parentValueProperty1); - parentModel.vars.add(parentValueProperty2); - - CodegenProperty childValueProperty1 = new CodegenProperty(); - childValueProperty1.name = "third_value"; - childValueProperty1.baseName = "third_value"; - childValueProperty1.nameInCamelCase = "ThirdValue"; - childValueProperty1.getter = "getThirdValue"; - childValueProperty1.setter = "setThirdValue"; - childValueProperty1.datatype = "other_type"; - CodegenProperty childValueProperty2 = new CodegenProperty(); - childValueProperty2.name = "value"; // same as parent "value" - childValueProperty2.baseName = "value"; - childValueProperty2.getter = "getValue"; // same as parent "getValue" - childValueProperty2.setter = "setValue"; // same as parent "setValue" - childValueProperty2.datatype = "different_type"; // different to parent "value_type" - - childModel.vars = new ArrayList<>(); - childModel.vars.add(childValueProperty1); - childModel.vars.add(childValueProperty2); - - Map allModels = new HashMap<>(); - allModels.put(parentModel.name, parentModel); - allModels.put(childModel.name, childModel); - - codegen.fixUpParentAndInterfaces(childModel, Collections.EMPTY_MAP); - Assert.assertEquals(childModel.vars.get(1).baseName, "value"); - Assert.assertEquals(childModel.vars.get(1).name, "childTypeValue"); - Assert.assertEquals(childModel.vars.get(1).nameInCamelCase, "ChildTypeValue"); - Assert.assertEquals(childModel.vars.get(1).getter, "getChildTypeValue"); - Assert.assertEquals(childModel.vars.get(1).setter, "setChildTypeValue"); - - // unchanged - Assert.assertEquals(childModel.vars.get(0).baseName, childValueProperty1.baseName); - Assert.assertEquals(childModel.vars.get(0).name, childValueProperty1.name); - Assert.assertEquals(childModel.vars.get(0).nameInCamelCase, childValueProperty1.nameInCamelCase); - Assert.assertEquals(childModel.vars.get(0).getter, childValueProperty1.getter); - Assert.assertEquals(childModel.vars.get(0).setter, childValueProperty1.setter); - } + + /** + * Issue #1066 - testing case when the conflicting property is actually not the first one but the + * second + */ + @Test + public void testFixUpParentAndInterfaces_2ndproperty_propertyNameSame_getterSetterSame_typeDifferent() { + AbstractJavaCodegen codegen = new P_AbstractJavaCodegen(); + + CodegenModel parentModel = new CodegenModel(); + parentModel.name = "parent_type"; + CodegenModel childModel = new CodegenModel(); + childModel.name = "child_type"; + childModel.parentModel = parentModel; + parentModel.children = new ArrayList<>(); + + CodegenProperty parentValueProperty1 = new CodegenProperty(); + parentValueProperty1.name = "value"; + parentValueProperty1.baseName = "value"; + parentValueProperty1.getter = "getValue"; + parentValueProperty1.setter = "setValue"; + parentValueProperty1.datatype = "value_type"; + CodegenProperty parentValueProperty2 = new CodegenProperty(); + parentValueProperty2.name = "other_value"; + parentValueProperty2.baseName = "other_value"; + parentValueProperty2.getter = "getOtherValue"; + parentValueProperty2.setter = "setOtherValue"; + parentValueProperty2.datatype = "other_type"; + parentModel.vars = new ArrayList<>(); + parentModel.vars.add(parentValueProperty1); + parentModel.vars.add(parentValueProperty2); + + CodegenProperty childValueProperty1 = new CodegenProperty(); + childValueProperty1.name = "third_value"; + childValueProperty1.baseName = "third_value"; + childValueProperty1.nameInCamelCase = "ThirdValue"; + childValueProperty1.getter = "getThirdValue"; + childValueProperty1.setter = "setThirdValue"; + childValueProperty1.datatype = "other_type"; + CodegenProperty childValueProperty2 = new CodegenProperty(); + childValueProperty2.name = "value"; // same as parent "value" + childValueProperty2.baseName = "value"; + childValueProperty2.getter = "getValue"; // same as parent "getValue" + childValueProperty2.setter = "setValue"; // same as parent "setValue" + childValueProperty2.datatype = "different_type"; // different to parent "value_type" + + childModel.vars = new ArrayList<>(); + childModel.vars.add(childValueProperty1); + childModel.vars.add(childValueProperty2); + + Map allModels = new HashMap<>(); + allModels.put(parentModel.name, parentModel); + allModels.put(childModel.name, childModel); + + codegen.fixUpParentAndInterfaces(childModel, Collections.EMPTY_MAP); + Assert.assertEquals(childModel.vars.get(1).baseName, "value"); + Assert.assertEquals(childModel.vars.get(1).name, "childTypeValue"); + Assert.assertEquals(childModel.vars.get(1).nameInCamelCase, "ChildTypeValue"); + Assert.assertEquals(childModel.vars.get(1).getter, "getChildTypeValue"); + Assert.assertEquals(childModel.vars.get(1).setter, "setChildTypeValue"); + + // unchanged + Assert.assertEquals(childModel.vars.get(0).baseName, childValueProperty1.baseName); + Assert.assertEquals(childModel.vars.get(0).name, childValueProperty1.name); + Assert.assertEquals(childModel.vars.get(0).nameInCamelCase, childValueProperty1.nameInCamelCase); + Assert.assertEquals(childModel.vars.get(0).getter, childValueProperty1.getter); + Assert.assertEquals(childModel.vars.get(0).setter, childValueProperty1.setter); + } public static class P_AbstractJavaCodegen extends AbstractJavaCodegen { @Override From 7ecb3224cd20101b0e8902891345d459146d634a Mon Sep 17 00:00:00 2001 From: AttilaW Date: Sun, 25 Sep 2022 17:42:48 +0200 Subject: [PATCH 091/223] remove more tabs and replace with spaces --- .../codegen/v3/generators/java/AbstractJavaCodegen.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java index 32a369a59c..886a1efc21 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/java/AbstractJavaCodegen.java @@ -1037,7 +1037,7 @@ protected void fixUpParentAndInterfaces(CodegenModel codegenModel, Map Date: Tue, 4 Oct 2022 11:18:52 -0500 Subject: [PATCH 092/223] fixed property datatype for extended models --- .../dotnet/CSharpClientCodegen.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/io/swagger/codegen/v3/generators/dotnet/CSharpClientCodegen.java b/src/main/java/io/swagger/codegen/v3/generators/dotnet/CSharpClientCodegen.java index 7bacb60a57..9112e9cc3a 100644 --- a/src/main/java/io/swagger/codegen/v3/generators/dotnet/CSharpClientCodegen.java +++ b/src/main/java/io/swagger/codegen/v3/generators/dotnet/CSharpClientCodegen.java @@ -587,6 +587,26 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty propert super.postProcessModelProperty(model, property); } + @Override + protected void fixUpParentAndInterfaces(CodegenModel codegenModel, Map allModels) { + super.fixUpParentAndInterfaces(codegenModel, allModels); + final CodegenModel parentModel = codegenModel.getParentModel(); + if (parentModel == null || (codegenModel.getReadWriteVars() == null || codegenModel.getReadWriteVars().isEmpty()) || (parentModel.getVars() == null || parentModel.getVars().isEmpty())) { + return; + } + codegenModel.setParentVars(parentModel.getVars()); + parentModel.getVars().forEach(parentProperty -> { + codegenModel.getReadWriteVars().stream() + .filter(codegenProperty -> parentProperty.getName().equalsIgnoreCase(codegenProperty.getName())) + .findFirst() + .ifPresent(codegenProperty -> { + codegenProperty.setDatatype(parentProperty.getDatatype()); + codegenProperty.setDatatypeWithEnum(parentProperty.getDatatypeWithEnum()); + }); + }); + + } + /* * The swagger pattern spec follows the Perl convention and style of modifiers. .NET * does not support this syntax directly so we need to convert the pattern to a .NET compatible From 904ad32164d469065ed7bf07627dfd49bfc692f6 Mon Sep 17 00:00:00 2001 From: Hugo Mercado Date: Wed, 12 Oct 2022 12:04:54 -0500 Subject: [PATCH 093/223] fixed response schema issue on html2 generated doc. --- src/main/resources/handlebars/htmlDocs2/index.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/handlebars/htmlDocs2/index.mustache b/src/main/resources/handlebars/htmlDocs2/index.mustache index ea738f4556..fca92bbe49 100644 --- a/src/main/resources/handlebars/htmlDocs2/index.mustache +++ b/src/main/resources/handlebars/htmlDocs2/index.mustache @@ -352,7 +352,7 @@