diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/resteasy/eap/enumOuterClass.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/resteasy/eap/enumOuterClass.mustache index 77ae9521fa5..779ef218291 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/resteasy/eap/enumOuterClass.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/resteasy/eap/enumOuterClass.mustache @@ -1,7 +1,20 @@ -public enum {{classname}} { - {{#allowableValues}} - {{#enumVars}} - {{{name}}}{{^-last}},{{/-last}}{{#-last}};{{/-last}} - {{/enumVars}} - {{/allowableValues}} -} \ No newline at end of file +/** + * {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{description}}{{/description}} + */ +public enum {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} { + {{#allowableValues}}{{#enumVars}} + {{{name}}}({{{value}}}){{^-last}}, + {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} + + private {{{dataType}}} value; + + {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}({{{dataType}}} value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } +} diff --git a/modules/swagger-codegen/src/main/resources/JavaJaxRS/resteasy/enumOuterClass.mustache b/modules/swagger-codegen/src/main/resources/JavaJaxRS/resteasy/enumOuterClass.mustache index 7aea7b92f22..779ef218291 100644 --- a/modules/swagger-codegen/src/main/resources/JavaJaxRS/resteasy/enumOuterClass.mustache +++ b/modules/swagger-codegen/src/main/resources/JavaJaxRS/resteasy/enumOuterClass.mustache @@ -1,3 +1,20 @@ -public enum {{classname}} { - {{#allowableValues}}{{.}}{{^-last}}, {{/-last}}{{/allowableValues}} -} \ No newline at end of file +/** + * {{^description}}Gets or Sets {{{name}}}{{/description}}{{#description}}{{description}}{{/description}} + */ +public enum {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}} { + {{#allowableValues}}{{#enumVars}} + {{{name}}}({{{value}}}){{^-last}}, + {{/-last}}{{#-last}};{{/-last}}{{/enumVars}}{{/allowableValues}} + + private {{{dataType}}} value; + + {{#datatypeWithEnum}}{{{.}}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{{classname}}}{{/datatypeWithEnum}}({{{dataType}}} value) { + this.value = value; + } + + @Override + @JsonValue + public String toString() { + return String.valueOf(value); + } +} diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JavaResteasyOuterEnumTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JavaResteasyOuterEnumTest.java new file mode 100644 index 00000000000..c1bb5bc9a97 --- /dev/null +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/jaxrs/JavaResteasyOuterEnumTest.java @@ -0,0 +1,73 @@ +package io.swagger.codegen.jaxrs; + +import io.swagger.codegen.ClientOptInput; +import io.swagger.codegen.ClientOpts; +import io.swagger.codegen.CodegenConfig; +import io.swagger.codegen.DefaultGenerator; +import io.swagger.codegen.languages.JavaResteasyEapServerCodegen; +import io.swagger.codegen.languages.JavaResteasyServerCodegen; +import io.swagger.models.Swagger; +import io.swagger.parser.SwaggerParser; +import org.apache.commons.io.FileUtils; +import org.junit.rules.TemporaryFolder; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.io.File; +import java.io.IOException; + +import static org.testng.Assert.assertTrue; + +public class JavaResteasyOuterEnumTest { + + public TemporaryFolder folder = new TemporaryFolder(); + + @BeforeMethod + public void setUp() throws Exception { + folder.create(); + } + + @AfterMethod + public void tearDown() throws Exception { + folder.delete(); + } + + @DataProvider(name = "codegenConfigs") + public Object[][] codegenConfigs() { + return new Object[][]{ + {new JavaResteasyServerCodegen()}, + {new JavaResteasyEapServerCodegen()} + }; + } + + @Test(dataProvider = "codegenConfigs", description = "outer enum has value constructor and @JsonValue") + public void outerEnumTest(CodegenConfig codegenConfig) throws IOException { + final File outputFolder = folder.getRoot(); + final Swagger swagger = new SwaggerParser().read("2_0/issue-3856.yaml"); + codegenConfig.setOutputDir(outputFolder.getAbsolutePath()); + + final ClientOptInput clientOptInput = new ClientOptInput().opts(new ClientOpts()).swagger(swagger).config(codegenConfig); + new DefaultGenerator().opts(clientOptInput).generate(); + + final File outerEnum = new File(outputFolder, "src/gen/java/io/swagger/model/OrderStatus.java"); + assertTrue(outerEnum.exists()); + assertTrue(containsString(outerEnum, "import com.fasterxml.jackson.annotation.JsonValue;")); + assertTrue(containsString(outerEnum, "public enum OrderStatus {")); + assertTrue(containsString(outerEnum, "PLACED(\"placed\"),")); + assertTrue(containsString(outerEnum, "APPROVED(\"approved\"),")); + assertTrue(containsString(outerEnum, "DELIVERED(\"delivered\");")); + assertTrue(containsString(outerEnum, "private String value;")); + assertTrue(containsString(outerEnum, "OrderStatus(String value) {")); + assertTrue(containsString(outerEnum, "@JsonValue\n public String toString() {")); + } + + private boolean containsString(File file, String search) throws IOException { + return normalize(FileUtils.readFileToString(file)).contains(normalize(search)); + } + + private String normalize(String value) { + return value.replace("\r\n", "\n"); + } +} diff --git a/modules/swagger-codegen/src/test/resources/2_0/issue-3856.yaml b/modules/swagger-codegen/src/test/resources/2_0/issue-3856.yaml new file mode 100644 index 00000000000..75a7b9cffd5 --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/2_0/issue-3856.yaml @@ -0,0 +1,35 @@ +swagger: '2.0' +info: + title: Outer enum generation (issue 3856) + version: 1.0.0 +basePath: /v1 +paths: + /orders/{orderId}/status: + get: + operationId: getOrderStatus + parameters: + - name: orderId + in: path + required: true + type: string + responses: + '200': + description: successful operation + schema: + $ref: '#/definitions/OrderStatus' +definitions: + OrderStatus: + type: string + description: Status of the order + enum: + - placed + - approved + - delivered + Order: + type: object + properties: + id: + type: integer + format: int64 + status: + $ref: '#/definitions/OrderStatus' \ No newline at end of file