From ed33b9a9d9d5e0e392b4296e2dde65f43f3b40c0 Mon Sep 17 00:00:00 2001 From: nekkiy Date: Mon, 18 Nov 2019 13:39:10 +0300 Subject: [PATCH 1/5] [fix-kotlinArrayEnumEmbedded] added test --- .../spring/KotlinSpringServerCodegenTest.java | 44 +++++++++++++++++++ .../issue______kotlinArrayEnumEmbedded.yaml | 26 +++++++++++ 2 files changed, 70 insertions(+) create mode 100644 modules/openapi-generator/src/test/resources/3_0/issue______kotlinArrayEnumEmbedded.yaml diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java index c830cd29b969..d88baa864d25 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java @@ -1,15 +1,58 @@ package org.openapitools.codegen.kotlin.spring; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.parser.OpenAPIParser; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.servers.Server; +import io.swagger.v3.parser.core.models.ParseOptions; +import org.openapitools.codegen.ClientOptInput; import org.openapitools.codegen.CodegenConstants; +import org.openapitools.codegen.MockDefaultGenerator; +import org.openapitools.codegen.TestUtils; +import org.openapitools.codegen.config.CodegenConfigurator; +import org.openapitools.codegen.languages.AbstractJavaCodegen; +import org.openapitools.codegen.languages.JavaClientCodegen; import org.openapitools.codegen.languages.KotlinSpringServerCodegen; +import org.openapitools.codegen.languages.SpringCodegen; +import org.openapitools.codegen.languages.features.CXFServerFeatures; import org.testng.Assert; import org.testng.annotations.Test; +import java.io.File; +import java.nio.file.Files; +import java.util.HashMap; +import java.util.Map; + public class KotlinSpringServerCodegenTest { + @Test(description = "test embedded enum array") + public void embeddedEnumArrayTest() throws Exception { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + String outputPath = output.getAbsolutePath().replace('\\', '/'); + OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/issue______kotlinArrayEnumEmbedded.yaml"); + KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); + codegen.setOutputDir(output.getAbsolutePath()); + codegen.additionalProperties().put(CodegenConstants.MODEL_PACKAGE, "zz.yyyy.model.xxxx"); + + ClientOptInput input = new ClientOptInput(); + input.openAPI(openAPI); + input.config(codegen); + + MockDefaultGenerator generator = new MockDefaultGenerator(); + generator.opts(input).generate(); + + String filePath = new File(output, "src/main/kotlin/zz/yyyy/model/xxxx/EmbeddedEnumArray.kt").getAbsolutePath().replace("\\", "/"); + String kotlinEmbArray = generator.getFiles().get(filePath); + System.out.println("====================="); + System.out.println(kotlinEmbArray); + System.out.println("====================="); + + + + } + @Test public void testInitialConfigValues() throws Exception { final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); @@ -34,6 +77,7 @@ public void testInitialConfigValues() throws Exception { Assert.assertEquals(codegen.additionalProperties().get(KotlinSpringServerCodegen.SERVER_PORT), "8080"); } + @Test public void testSettersForConfigValues() throws Exception { final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); diff --git a/modules/openapi-generator/src/test/resources/3_0/issue______kotlinArrayEnumEmbedded.yaml b/modules/openapi-generator/src/test/resources/3_0/issue______kotlinArrayEnumEmbedded.yaml new file mode 100644 index 000000000000..116e9550a89d --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issue______kotlinArrayEnumEmbedded.yaml @@ -0,0 +1,26 @@ +openapi: "3.0.1" +info: + title: test + version: "1.0" +paths: + /test: + get: + operationId: test + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/EmbeddedEnumArray' + +components: + schemas: + EmbeddedEnumArray: + type: object + properties: + colors: + type: array + items: + type: string + enum: ['BLACK', 'RED', 'ORANGE', 'YELLOW', 'BLUE', 'GREEN'] From 83816eed4deceb2c57851e7110e261c858d28e1b Mon Sep 17 00:00:00 2001 From: nekkiy Date: Tue, 19 Nov 2019 18:00:18 +0300 Subject: [PATCH 2/5] [imp-AddKotlinDynamicCompiler] add kotlin compiler --- modules/openapi-generator/pom.xml | 19 ++++ .../codegen/kotlin/KotlinTestUtils.java | 104 ++++++++++++++++++ .../codegen/kotlin/KotlinTestUtilsTest.java | 26 +++++ .../badPack/com/example/SimpleClass.kt | 8 ++ .../normalPack/com/example/SimpleClass.kt | 7 ++ 5 files changed, 164 insertions(+) create mode 100644 modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinTestUtils.java create mode 100644 modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinTestUtilsTest.java create mode 100644 modules/openapi-generator/src/test/resources/org/openapitools/codegen/kotlin/KotlinTestUtilsTest/badPack/com/example/SimpleClass.kt create mode 100644 modules/openapi-generator/src/test/resources/org/openapitools/codegen/kotlin/KotlinTestUtilsTest/normalPack/com/example/SimpleClass.kt diff --git a/modules/openapi-generator/pom.xml b/modules/openapi-generator/pom.xml index 25827d1793bb..a60ebba14294 100644 --- a/modules/openapi-generator/pom.xml +++ b/modules/openapi-generator/pom.xml @@ -200,6 +200,7 @@ 1.0.2 2.9.10 2.9.10 + 1.3.41 @@ -328,6 +329,24 @@ openapi-generator-core ${project.parent.version} + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin-version} + test + + + org.jetbrains.kotlin + kotlin-compiler-embeddable + ${kotlin-version} + test + + + org.jetbrains.kotlin + kotlin-script-util + ${kotlin-version} + test + diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinTestUtils.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinTestUtils.java new file mode 100644 index 000000000000..4f43823c1936 --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinTestUtils.java @@ -0,0 +1,104 @@ +package org.openapitools.codegen.kotlin; + +import kotlin.script.experimental.jvm.util.KotlinJars; +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys; +import org.jetbrains.kotlin.cli.common.config.ContentRootsKt; +import org.jetbrains.kotlin.cli.common.messages.MessageRenderer; +import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector; +import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles; +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler; +import org.jetbrains.kotlin.cli.jvm.config.JvmContentRootsKt; +import org.jetbrains.kotlin.codegen.state.GenerationState; +import org.jetbrains.kotlin.com.intellij.openapi.Disposable; +import org.jetbrains.kotlin.config.CommonConfigurationKeys; +import org.jetbrains.kotlin.config.CompilerConfiguration; +import org.jetbrains.kotlin.config.JVMConfigurationKeys; +import org.jetbrains.kotlin.config.JvmTarget; + +import java.io.*; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.util.*; + +import static kotlin.script.experimental.jvm.util.JvmClasspathUtilKt.classpathFromClassloader; + +public class KotlinTestUtils { + + public static ClassLoader buildModule(List sourcePath, ClassLoader classLoader) { + + String moduleName = UUID.randomUUID().toString().replaceAll("-", ""); + File saveClassesDir; + try { + saveClassesDir = Files.createTempDirectory("kotlin" + moduleName).toFile(); + } catch (IOException e) { + throw new RuntimeException(e); + } + compileModule(moduleName, sourcePath, saveClassesDir, classLoader, true); + + try { + return new URLClassLoader(new URL[]{saveClassesDir.toURI().toURL()}, classLoader); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + + } + + private static GenerationState compileModule(String moduleName, List sourcePath, File saveClassesDir, ClassLoader classLoader, boolean forcedAddKotlinStd) { + Disposable stubDisposable = new StubDisposable(); + CompilerConfiguration configuration = new CompilerConfiguration(); + configuration.put(CommonConfigurationKeys.MODULE_NAME, moduleName); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + PrintStream ps = null; + try { + ps = new PrintStream(baos, true, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + configuration.put(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY, new PrintingMessageCollector(ps, MessageRenderer.PLAIN_FULL_PATHS, true)); + configuration.put(JVMConfigurationKeys.OUTPUT_DIRECTORY, saveClassesDir); +// configuration.put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true) + configuration.put(JVMConfigurationKeys.JVM_TARGET, JvmTarget.JVM_1_8); + Set classPath = new HashSet<>(); + if (classLoader != null) { + classPath.addAll(classpathFromClassloader(classLoader, false)); + } + if (forcedAddKotlinStd) { + classPath.add(KotlinJars.INSTANCE.getStdlib()); + } + JvmContentRootsKt.addJvmClasspathRoots(configuration, new ArrayList<>(classPath)); + ContentRootsKt.addKotlinSourceRoots(configuration, sourcePath); + + KotlinCoreEnvironment env = KotlinCoreEnvironment.createForProduction(stubDisposable, configuration, EnvironmentConfigFiles.JVM_CONFIG_FILES); + GenerationState result = KotlinToJVMBytecodeCompiler.INSTANCE.analyzeAndGenerate(env); + ps.flush(); + if (result != null) { + return result; + } else { + String s; + try { + s = new String(baos.toByteArray(), "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + throw new IllegalStateException("Compilation error. Details:\n" + s); + } + } + + static class StubDisposable implements Disposable { + + volatile boolean isDisposed = false; + + @Override + public void dispose() { + isDisposed = true; + } + + public boolean isDisposed() { + return isDisposed; + } + } +} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinTestUtilsTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinTestUtilsTest.java new file mode 100644 index 000000000000..6aa8211a9a1f --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/KotlinTestUtilsTest.java @@ -0,0 +1,26 @@ +package org.openapitools.codegen.kotlin; + +import org.testng.Assert; +import org.testng.annotations.Test; + +import java.lang.reflect.Constructor; +import java.util.Collections; + +public class KotlinTestUtilsTest { + + @Test + public void testNormalCompile() throws Exception { + ClassLoader classLoader = KotlinTestUtils.buildModule(Collections.singletonList(getClass().getResource("KotlinTestUtilsTest/normalPack").getFile()), Thread.currentThread().getContextClassLoader()); + Class clazz = classLoader.loadClass("com.example.SimpleClass"); + Constructor[] constructors = clazz.getConstructors(); + Assert.assertEquals(1, constructors.length); + Constructor constr = constructors[0]; + Object testObj = constr.newInstance("test"); + } + + @Test(expectedExceptions = Exception.class) + public void testBadCompile() { + KotlinTestUtils.buildModule(Collections.singletonList(getClass().getResource("KotlinTestUtilsTest/badPack").getFile()), Thread.currentThread().getContextClassLoader()); + } + +} diff --git a/modules/openapi-generator/src/test/resources/org/openapitools/codegen/kotlin/KotlinTestUtilsTest/badPack/com/example/SimpleClass.kt b/modules/openapi-generator/src/test/resources/org/openapitools/codegen/kotlin/KotlinTestUtilsTest/badPack/com/example/SimpleClass.kt new file mode 100644 index 000000000000..92305471500f --- /dev/null +++ b/modules/openapi-generator/src/test/resources/org/openapitools/codegen/kotlin/KotlinTestUtilsTest/badPack/com/example/SimpleClass.kt @@ -0,0 +1,8 @@ +package com.example + + +class SimpleClass { + fun void testFun(){ + + } +} \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/org/openapitools/codegen/kotlin/KotlinTestUtilsTest/normalPack/com/example/SimpleClass.kt b/modules/openapi-generator/src/test/resources/org/openapitools/codegen/kotlin/KotlinTestUtilsTest/normalPack/com/example/SimpleClass.kt new file mode 100644 index 000000000000..3243ef2bf081 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/org/openapitools/codegen/kotlin/KotlinTestUtilsTest/normalPack/com/example/SimpleClass.kt @@ -0,0 +1,7 @@ +package com.example + +class SimpleClass (val someStr:String) { + fun testFun(str: String) { + + } +} \ No newline at end of file From 3ab9611366aa6138d6c5513d873a6304b08bcc8d Mon Sep 17 00:00:00 2001 From: nekkiy Date: Tue, 19 Nov 2019 18:33:20 +0300 Subject: [PATCH 3/5] [fix-kotlinArrayEnumEmbedded] modify test to runtime compilation --- .../spring/KotlinSpringServerCodegenTest.java | 33 ++++++++----------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java index acc7b37a09b5..43f2c21745f6 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java @@ -6,11 +6,10 @@ import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.servers.Server; import io.swagger.v3.parser.core.models.ParseOptions; -import org.openapitools.codegen.ClientOptInput; -import org.openapitools.codegen.CodegenConstants; -import org.openapitools.codegen.MockDefaultGenerator; -import org.openapitools.codegen.TestUtils; +import org.apache.commons.io.FileUtils; +import org.openapitools.codegen.*; import org.openapitools.codegen.config.CodegenConfigurator; +import org.openapitools.codegen.kotlin.KotlinTestUtils; import org.openapitools.codegen.languages.AbstractJavaCodegen; import org.openapitools.codegen.languages.JavaClientCodegen; import org.openapitools.codegen.languages.KotlinSpringServerCodegen; @@ -21,36 +20,30 @@ import java.io.File; import java.nio.file.Files; +import java.util.Collections; import java.util.HashMap; import java.util.Map; public class KotlinSpringServerCodegenTest { - @Test(description = "test embedded enum array") + @Test(description = "test embedded enum array", enabled = false) //TODO fix me public void embeddedEnumArrayTest() throws Exception { + String baseModelPackage = "zz"; File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); + System.out.println(output.getAbsolutePath()); OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/issue______kotlinArrayEnumEmbedded.yaml"); KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.MODEL_PACKAGE, "zz.yyyy.model.xxxx"); - + codegen.additionalProperties().put(CodegenConstants.MODEL_PACKAGE, baseModelPackage + ".yyyy.model.xxxx"); ClientOptInput input = new ClientOptInput(); input.openAPI(openAPI); input.config(codegen); - - MockDefaultGenerator generator = new MockDefaultGenerator(); + DefaultGenerator generator = new DefaultGenerator(); generator.opts(input).generate(); - - String filePath = new File(output, "src/main/kotlin/zz/yyyy/model/xxxx/EmbeddedEnumArray.kt").getAbsolutePath().replace("\\", "/"); - String kotlinEmbArray = generator.getFiles().get(filePath); - System.out.println("====================="); - System.out.println(kotlinEmbArray); - System.out.println("====================="); - - - + File resultSourcePath = new File(output, "src/main/kotlin"); + File outputModel = Files.createTempDirectory("test").toFile().getCanonicalFile(); + FileUtils.copyDirectory(new File(resultSourcePath, baseModelPackage), new File(outputModel, baseModelPackage)); + KotlinTestUtils.buildModule(Collections.singletonList(outputModel.getAbsolutePath()), Thread.currentThread().getContextClassLoader()); } @Test From 9ce6521ea4e2ea1ab4bd09cbcd1856e0b5ca418e Mon Sep 17 00:00:00 2001 From: nekkiy Date: Thu, 21 Nov 2019 12:14:51 +0300 Subject: [PATCH 4/5] [fix-kotlinArrayEnumEmbedded] fix embedded enum array --- .../languages/AbstractKotlinCodegen.java | 4 ++- .../kotlin-spring/dataClass.mustache | 2 +- .../kotlin-spring/dataClassOptVar.mustache | 2 +- .../kotlin-spring/dataClassReqVar.mustache | 2 +- .../spring/KotlinSpringServerCodegenTest.java | 10 +++--- .../issue______kotlinArrayEnumEmbedded.yaml | 34 +++++++++++++++++++ 6 files changed, 44 insertions(+), 10 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java index 733cdd47b476..b1742671c00f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractKotlinCodegen.java @@ -697,9 +697,11 @@ public String toModelFilename(String name) { private String getArrayTypeDeclaration(ArraySchema arr) { // TODO: collection type here should be fully qualified namespace to avoid model conflicts // This supports arrays of arrays. - String arrayType = typeMapping.get("array"); + String arrayType; if (Boolean.TRUE.equals(arr.getUniqueItems())) { arrayType = typeMapping.get("set"); + } else { + arrayType = typeMapping.get("array"); } StringBuilder instantiationType = new StringBuilder(arrayType); Schema items = arr.getItems(); diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache index 5a8079786c58..607daa0f8deb 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache @@ -25,7 +25,7 @@ * {{{description}}} * Values: {{#allowableValues}}{{#enumVars}}{{&name}}{{^-last}},{{/-last}}{{/enumVars}}{{/allowableValues}} */ - enum class {{nameInCamelCase}}(val value: {{{dataType}}}) { + enum class {{nameInCamelCase}}(val value: {{#isContainer}}{{#items}}{{{dataType}}}{{/items}}{{/isContainer}}{{^isContainer}}{{{dataType}}}{{/isContainer}}) { {{#allowableValues}}{{#enumVars}} @JsonProperty({{{value}}}) {{{name}}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}} {{/enumVars}}{{/allowableValues}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache index 767595052b75..8b9114c89597 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache @@ -1,4 +1,4 @@ {{#useBeanValidation}}{{#required}} {{^isReadOnly}}@get:NotNull{{/isReadOnly}} {{/required}}{{>beanValidationModel}}{{/useBeanValidation}}{{#swaggerAnnotations}} @ApiModelProperty({{#example}}example = "{{{example}}}", {{/example}}{{#required}}required = {{required}}, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{/swaggerAnnotations}} - @JsonProperty("{{{baseName}}}"){{#isInherited}} override{{/isInherited}} val {{{name}}}: {{#isEnum}}{{classname}}.{{nameInCamelCase}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}} \ No newline at end of file + @JsonProperty("{{{baseName}}}"){{#isInherited}} override{{/isInherited}} val {{{name}}}: {{#isEnum}}{{#isListContainer}}{{baseType}}<{{/isListContainer}}{{classname}}.{{nameInCamelCase}}{{#isListContainer}}>{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache index f53fadc9b18f..28ce45656215 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache @@ -1,4 +1,4 @@ {{#useBeanValidation}}{{#required}} {{^isReadOnly}}@get:NotNull{{/isReadOnly}} {{/required}}{{>beanValidationModel}}{{/useBeanValidation}}{{#swaggerAnnotations}} @ApiModelProperty({{#example}}example = "{{{example}}}", {{/example}}{{#required}}required = {{required}}, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{/swaggerAnnotations}} - @JsonProperty("{{{baseName}}}"){{#isInherited}} override{{/isInherited}} val {{{name}}}: {{#isEnum}}{{classname}}.{{nameInCamelCase}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isReadOnly}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}}{{/isReadOnly}} \ No newline at end of file + @JsonProperty("{{{baseName}}}"){{#isInherited}} override{{/isInherited}} val {{{name}}}: {{#isEnum}}{{#isListContainer}}{{baseType}}<{{/isListContainer}}{{classname}}.{{nameInCamelCase}}{{/isEnum}}{{#isListContainer}}>{{/isListContainer}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isReadOnly}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}}{{/isReadOnly}} \ No newline at end of file diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java index 43f2c21745f6..9a4f3357feeb 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java @@ -21,16 +21,13 @@ import java.io.File; import java.nio.file.Files; import java.util.Collections; -import java.util.HashMap; -import java.util.Map; public class KotlinSpringServerCodegenTest { - @Test(description = "test embedded enum array", enabled = false) //TODO fix me + @Test(description = "test embedded enum array") public void embeddedEnumArrayTest() throws Exception { String baseModelPackage = "zz"; - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - System.out.println(output.getAbsolutePath()); + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); //may be move to /build OpenAPI openAPI = TestUtils.parseSpec("src/test/resources/3_0/issue______kotlinArrayEnumEmbedded.yaml"); KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); codegen.setOutputDir(output.getAbsolutePath()); @@ -43,7 +40,8 @@ public void embeddedEnumArrayTest() throws Exception { File resultSourcePath = new File(output, "src/main/kotlin"); File outputModel = Files.createTempDirectory("test").toFile().getCanonicalFile(); FileUtils.copyDirectory(new File(resultSourcePath, baseModelPackage), new File(outputModel, baseModelPackage)); - KotlinTestUtils.buildModule(Collections.singletonList(outputModel.getAbsolutePath()), Thread.currentThread().getContextClassLoader()); + //no exception + ClassLoader cl = KotlinTestUtils.buildModule(Collections.singletonList(outputModel.getAbsolutePath()), Thread.currentThread().getContextClassLoader()); } @Test diff --git a/modules/openapi-generator/src/test/resources/3_0/issue______kotlinArrayEnumEmbedded.yaml b/modules/openapi-generator/src/test/resources/3_0/issue______kotlinArrayEnumEmbedded.yaml index 116e9550a89d..bdb8a76de32a 100644 --- a/modules/openapi-generator/src/test/resources/3_0/issue______kotlinArrayEnumEmbedded.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/issue______kotlinArrayEnumEmbedded.yaml @@ -24,3 +24,37 @@ components: items: type: string enum: ['BLACK', 'RED', 'ORANGE', 'YELLOW', 'BLUE', 'GREEN'] + reqColors: + type: array + items: + type: string + enum: ['BLACK', 'RED', 'ORANGE', 'YELLOW', 'BLUE', 'GREEN'] + required: + - reqColors + NoEmbeddedEnumArray: + type: object + properties: + colors: + type: array + items: + $ref: '#/components/schemas/Colors' + reqColors: + type: array + items: + $ref: '#/components/schemas/Colors' + required: + - reqColors + Colors: + type: string + enum: ['BLACK', 'RED', 'ORANGE', 'YELLOW', 'BLUE', 'GREEN'] + SimpleColorContainer: + type: object + properties: + color: + type: string + enum: ['BLACK', 'RED', 'ORANGE', 'YELLOW', 'BLUE', 'GREEN'] + reqColor: + type: string + enum: ['BLACK', 'RED', 'ORANGE', 'YELLOW', 'BLUE', 'GREEN'] + required: + - reqColor From 61c36c21f329350a96d9b85f611edae1d1e0bd3a Mon Sep 17 00:00:00 2001 From: nekkiy Date: Thu, 21 Nov 2019 13:59:53 +0300 Subject: [PATCH 5/5] [fix-kotlinArrayEnumEmbedded] fix redundant > --- .../src/main/resources/kotlin-spring/dataClassReqVar.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache index 28ce45656215..2edad74ffb81 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache @@ -1,4 +1,4 @@ {{#useBeanValidation}}{{#required}} {{^isReadOnly}}@get:NotNull{{/isReadOnly}} {{/required}}{{>beanValidationModel}}{{/useBeanValidation}}{{#swaggerAnnotations}} @ApiModelProperty({{#example}}example = "{{{example}}}", {{/example}}{{#required}}required = {{required}}, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{/swaggerAnnotations}} - @JsonProperty("{{{baseName}}}"){{#isInherited}} override{{/isInherited}} val {{{name}}}: {{#isEnum}}{{#isListContainer}}{{baseType}}<{{/isListContainer}}{{classname}}.{{nameInCamelCase}}{{/isEnum}}{{#isListContainer}}>{{/isListContainer}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isReadOnly}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}}{{/isReadOnly}} \ No newline at end of file + @JsonProperty("{{{baseName}}}"){{#isInherited}} override{{/isInherited}} val {{{name}}}: {{#isEnum}}{{#isListContainer}}{{baseType}}<{{/isListContainer}}{{classname}}.{{nameInCamelCase}}{{#isListContainer}}>{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isReadOnly}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}}{{/isReadOnly}} \ No newline at end of file