diff --git a/.github/workflows/samples-kotlin-server-jdk17.yaml b/.github/workflows/samples-kotlin-server-jdk17.yaml index 999e2f4d817b..a95a26de17de 100644 --- a/.github/workflows/samples-kotlin-server-jdk17.yaml +++ b/.github/workflows/samples-kotlin-server-jdk17.yaml @@ -37,6 +37,8 @@ jobs: - samples/server/petstore/kotlin-server-required-and-nullable-properties - samples/server/petstore/kotlin-springboot-3 - samples/server/petstore/kotlin-springboot-3-no-response-entity + - samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2 + - samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only - samples/server/petstore/kotlin-springboot-additionalproperties - samples/server/petstore/kotlin-springboot-delegate-nodefaults - samples/server/petstore/kotlin-springboot-request-cookie diff --git a/.github/workflows/samples-kotlin-server.yaml b/.github/workflows/samples-kotlin-server.yaml index 0ab8e5389059..5865ec6b38f9 100644 --- a/.github/workflows/samples-kotlin-server.yaml +++ b/.github/workflows/samples-kotlin-server.yaml @@ -41,6 +41,7 @@ jobs: - samples/server/petstore/kotlin-springboot-source-swagger2 - samples/server/petstore/kotlin-springboot-springfox - samples/server/petstore/kotlin-springboot-x-kotlin-implements + - samples/server/petstore/kotlin-springboot-dollar-issue-swagger1 - samples/server/petstore/kotlin-springboot-include-http-request-context-delegate - samples/server/petstore/kotlin-server/ktor - samples/server/petstore/kotlin-server/ktor2 diff --git a/bin/configs/kotlin-spring-boot-3-dollar-issue-swagger2-interface-only.yaml b/bin/configs/kotlin-spring-boot-3-dollar-issue-swagger2-interface-only.yaml new file mode 100644 index 000000000000..5a42e32a9666 --- /dev/null +++ b/bin/configs/kotlin-spring-boot-3-dollar-issue-swagger2-interface-only.yaml @@ -0,0 +1,14 @@ +generatorName: kotlin-spring +outputDir: samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only +library: spring-boot +inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml +templateDir: modules/openapi-generator/src/main/resources/kotlin-spring +additionalProperties: + documentationProvider: springDoc + annotationLibrary: swagger2 + useSwaggerUI: "false" + interfaceOnly: "true" + serializableModel: "true" + beanValidations: "true" + useSpringBoot3: "true" + requestMappingMode: api_interface diff --git a/bin/configs/kotlin-spring-boot-3-dollar-issue-swagger2.yaml b/bin/configs/kotlin-spring-boot-3-dollar-issue-swagger2.yaml new file mode 100644 index 000000000000..daa8216e4a43 --- /dev/null +++ b/bin/configs/kotlin-spring-boot-3-dollar-issue-swagger2.yaml @@ -0,0 +1,14 @@ +generatorName: kotlin-spring +outputDir: samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2 +library: spring-boot +inputSpec: modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml +templateDir: modules/openapi-generator/src/main/resources/kotlin-spring +additionalProperties: + documentationProvider: springDoc + annotationLibrary: swagger2 + useSwaggerUI: "false" + serviceImplementation: "true" + serializableModel: "true" + beanValidations: "true" + useSpringBoot3: "true" + requestMappingMode: api_interface diff --git a/bin/configs/kotlin-spring-boot-dollar-issue-swagger1.yaml b/bin/configs/kotlin-spring-boot-dollar-issue-swagger1.yaml new file mode 100644 index 000000000000..25aa6b750647 --- /dev/null +++ b/bin/configs/kotlin-spring-boot-dollar-issue-swagger1.yaml @@ -0,0 +1,13 @@ +generatorName: kotlin-spring +outputDir: samples/server/petstore/kotlin-springboot-dollar-issue-swagger1 +library: spring-boot +inputSpec: modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml +templateDir: modules/openapi-generator/src/main/resources/kotlin-spring +additionalProperties: + documentationProvider: springFox + annotationLibrary: swagger1 + useSwaggerUI: "false" + serviceImplementation: "true" + serializableModel: "true" + beanValidations: "true" + requestMappingMode: api_interface diff --git a/bin/configs/kotlin-spring-boot-x-kotlin-implements.yaml b/bin/configs/kotlin-spring-boot-x-kotlin-implements.yaml index 1d1218b58452..8d5911e56c37 100644 --- a/bin/configs/kotlin-spring-boot-x-kotlin-implements.yaml +++ b/bin/configs/kotlin-spring-boot-x-kotlin-implements.yaml @@ -9,7 +9,7 @@ additionalProperties: useSwaggerUI: false serviceImplementation: false skipDefaultInterface: true - interfaceOnly: true + interfaceOnly: false serializableModel: true beanValidations: true includeHttpRequestContext: true diff --git a/bin/configs/kotlin-spring-declarative-interface-reactive-coroutines.yaml b/bin/configs/kotlin-spring-declarative-interface-reactive-coroutines.yaml index f5375f8f0fb7..30e6dc86712e 100644 --- a/bin/configs/kotlin-spring-declarative-interface-reactive-coroutines.yaml +++ b/bin/configs/kotlin-spring-declarative-interface-reactive-coroutines.yaml @@ -1,7 +1,7 @@ generatorName: kotlin-spring outputDir: samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines library: spring-declarative-http-interface -inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml +inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml templateDir: modules/openapi-generator/src/main/resources/kotlin-spring additionalProperties: documentationProvider: springDoc diff --git a/bin/configs/kotlin-spring-declarative-interface-reactive-reactor-wrapped.yaml b/bin/configs/kotlin-spring-declarative-interface-reactive-reactor-wrapped.yaml index 0826f5059e33..e4dc0aba73e8 100644 --- a/bin/configs/kotlin-spring-declarative-interface-reactive-reactor-wrapped.yaml +++ b/bin/configs/kotlin-spring-declarative-interface-reactive-reactor-wrapped.yaml @@ -1,7 +1,7 @@ generatorName: kotlin-spring outputDir: samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped library: spring-declarative-http-interface -inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml +inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml templateDir: modules/openapi-generator/src/main/resources/kotlin-spring additionalProperties: documentationProvider: springDoc diff --git a/bin/configs/kotlin-spring-declarative-interface-wrapped.yaml b/bin/configs/kotlin-spring-declarative-interface-wrapped.yaml index ce0d79f6e97b..5332cf5c0448 100644 --- a/bin/configs/kotlin-spring-declarative-interface-wrapped.yaml +++ b/bin/configs/kotlin-spring-declarative-interface-wrapped.yaml @@ -1,7 +1,7 @@ generatorName: kotlin-spring outputDir: samples/server/petstore/kotlin-spring-declarative-interface-wrapped library: spring-declarative-http-interface -inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml +inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml templateDir: modules/openapi-generator/src/main/resources/kotlin-spring additionalProperties: documentationProvider: springDoc diff --git a/bin/configs/kotlin-spring-declarative-interface.yaml b/bin/configs/kotlin-spring-declarative-interface.yaml index da5c9c0a8854..b399470a5a2e 100644 --- a/bin/configs/kotlin-spring-declarative-interface.yaml +++ b/bin/configs/kotlin-spring-declarative-interface.yaml @@ -1,7 +1,7 @@ generatorName: kotlin-spring outputDir: samples/server/petstore/kotlin-spring-declarative-interface library: spring-declarative-http-interface -inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml +inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml templateDir: modules/openapi-generator/src/main/resources/kotlin-spring additionalProperties: documentationProvider: springDoc diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java index 47e09ea292d4..e8c89ac9b6fa 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenOperation.java @@ -33,7 +33,7 @@ public class CodegenOperation { hasErrorResponseObject; // if 4xx, 5xx responses have at least one error object defined public CodegenProperty returnProperty; public String path, operationId, returnType, returnFormat, httpMethod, returnBaseType, - returnContainer, summary, unescapedNotes, notes, baseName, defaultResponse; + returnContainer, summary, unescapedSummary, unescapedNotes, notes, baseName, defaultResponse; public CodegenDiscriminator discriminator; public List> consumes, produces, prioritizedContentTypes; public List servers = new ArrayList(); @@ -429,6 +429,7 @@ public String toString() { sb.append(", returnBaseType='").append(returnBaseType).append('\''); sb.append(", returnContainer='").append(returnContainer).append('\''); sb.append(", summary='").append(summary).append('\''); + sb.append(", unescapedSummary='").append(unescapedSummary).append('\''); sb.append(", unescapedNotes='").append(unescapedNotes).append('\''); sb.append(", notes='").append(notes).append('\''); sb.append(", baseName='").append(baseName).append('\''); @@ -502,6 +503,7 @@ public boolean equals(Object o) { Objects.equals(returnBaseType, that.returnBaseType) && Objects.equals(returnContainer, that.returnContainer) && Objects.equals(summary, that.summary) && + Objects.equals(unescapedSummary, that.unescapedSummary) && Objects.equals(unescapedNotes, that.unescapedNotes) && Objects.equals(notes, that.notes) && Objects.equals(baseName, that.baseName) && @@ -547,7 +549,7 @@ public int hashCode() { returnTypeIsPrimitive, returnSimpleType, subresourceOperation, isMap, isArray, isMultipart, isVoid, isResponseBinary, isResponseFile, isResponseOptional, hasReference, isDeprecated, isCallbackRequest, uniqueItems, path, operationId, returnType, httpMethod, - returnBaseType, returnContainer, summary, unescapedNotes, notes, baseName, defaultResponse, + returnBaseType, returnContainer, summary, unescapedSummary, unescapedNotes, notes, baseName, defaultResponse, discriminator, consumes, produces, prioritizedContentTypes, servers, bodyParam, allParams, bodyParams, pathParams, queryParams, headerParams, formParams, cookieParams, requiredParams, returnProperty, optionalParams, authMethods, tags, responses, callbacks, imports, examples, requestBodyExamples, externalDocs, diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java index 3298d80868f2..c9a426d7b9a1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenResponse.java @@ -33,6 +33,7 @@ public class CodegenResponse implements IJsonSchemaValidationProperties { public boolean is4xx; public boolean is5xx; public String message; + public String unescapedMessage; public List> examples; public String dataType; public String baseType; @@ -109,7 +110,7 @@ public class CodegenResponse implements IJsonSchemaValidationProperties { @Override public int hashCode() { - return Objects.hash(headers, code, message, examples, dataType, baseType, containerType, containerTypeMapped, hasHeaders, + return Objects.hash(headers, code, message, unescapedMessage, examples, dataType, baseType, containerType, containerTypeMapped, hasHeaders, isString, isNumeric, isInteger, isLong, isNumber, isFloat, isDouble, isDecimal, isByteArray, isBoolean, isDate, isDateTime, isUuid, isEmail, isPassword, isModel, isFreeFormObject, isAnyType, isDefault, simpleType, primitiveType, isMap, isOptional, isArray, isBinary, isFile, schema, jsonSchema, vendorExtensions, items, additionalProperties, @@ -182,6 +183,7 @@ public boolean equals(Object o) { Objects.equals(headers, that.headers) && Objects.equals(code, that.code) && Objects.equals(message, that.message) && + Objects.equals(unescapedMessage, that.unescapedMessage) && Objects.equals(examples, that.examples) && Objects.equals(dataType, that.dataType) && Objects.equals(baseType, that.baseType) && @@ -582,6 +584,7 @@ public String toString() { sb.append(", is4xx='").append(is4xx).append('\''); sb.append(", is5xx='").append(is5xx).append('\''); sb.append(", message='").append(message).append('\''); + sb.append(", unescapedMessage='").append(unescapedMessage).append('\''); sb.append(", examples=").append(examples); sb.append(", dataType='").append(dataType).append('\''); sb.append(", baseType='").append(baseType).append('\''); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index bd2683cf6826..c1e609891642 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -4675,6 +4675,7 @@ public CodegenOperation fromOperation(String path, } op.summary = escapeText(operation.getSummary()); + op.unescapedSummary = operation.getSummary(); op.unescapedNotes = operation.getDescription(); op.notes = escapeText(operation.getDescription()); op.hasConsumes = false; @@ -4839,6 +4840,7 @@ public CodegenOperation fromOperation(String path, if (bodyParam != null) { bodyParam.description = escapeText(requestBody.getDescription()); + bodyParam.unescapedDescription = requestBody.getDescription(); postProcessParameter(bodyParam); bodyParams.add(bodyParam); if (prependFormOrBodyParameters) { @@ -5029,6 +5031,7 @@ public CodegenResponse fromResponse(String responseCode, ApiResponse response) { } r.schema = responseSchema; r.message = escapeText(response.getDescription()); + r.unescapedMessage = response.getDescription(); // adding examples to API responses Map examples = ExamplesUtils.getExamplesFromResponse(openAPI, response); @@ -7575,6 +7578,7 @@ protected void addBodyModelSchema(CodegenParameter codegenParameter, String name codegenParameter.baseType = codegenModel.classname; codegenParameter.dataType = getTypeDeclaration(codegenModel.classname); codegenParameter.description = codegenModel.description; + codegenParameter.unescapedDescription = codegenModel.unescapedDescription; codegenParameter.isNullable = codegenModel.isNullable; imports.add(codegenParameter.baseType); } else { @@ -7948,6 +7952,7 @@ public CodegenParameter fromRequestBody(RequestBody body, Set imports, S codegenParameter.baseName = "UNKNOWN_BASE_NAME"; codegenParameter.paramName = "UNKNOWN_PARAM_NAME"; codegenParameter.description = escapeText(body.getDescription()); + codegenParameter.unescapedDescription = body.getDescription(); codegenParameter.required = body.getRequired() != null ? body.getRequired() : Boolean.FALSE; codegenParameter.isBodyParam = Boolean.TRUE; if (body.getExtensions() != null) { 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 09b03e1a1f95..5e024d05f71e 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 @@ -1131,7 +1131,8 @@ protected void updateModelForObject(CodegenModel m, Schema schema) { @Override protected ImmutableMap.Builder addMustacheLambdas() { return super.addMustacheLambdas() - .put("escapeDollar", new EscapeChar("(?=}}<%contextPath%><%={{ }}=%>" {{/useRequestMappingOnController}} {{#operation}} - const val PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}}: String = "{{{path}}}" + const val PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}}: String = "{{#lambdaEscapeInNormalString}}{{{path}}}{{/lambdaEscapeInNormalString}}" {{/operation}} } } diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/apiInterface.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/apiInterface.mustache index 0f1dcbd41551..7f43bfeded66 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/apiInterface.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/apiInterface.mustache @@ -85,28 +85,28 @@ interface {{classname}} { }}{{#swagger2AnnotationLibrary}}{{! }} @Operation( tags = [{{#tags}}"{{{name}}}",{{/tags}}], - summary = "{{{summary}}}", + summary = "{{#lambda.escapeDollar}}{{{summary}}}{{/lambda.escapeDollar}}", operationId = "{{{operationId}}}", - description = """{{{unescapedNotes}}}""", + description = """{{#lambda.escapeDollarInMultiline}}{{{unescapedNotes}}}{{/lambda.escapeDollarInMultiline}}""", responses = [{{#responses}} - ApiResponse(responseCode = "{{{code}}}", description = "{{{message}}}"{{#baseType}}, content = [Content({{#isArray}}array = ArraySchema({{/isArray}}schema = Schema(implementation = {{{baseType}}}::class)){{#isArray}}){{/isArray}}]{{/baseType}}){{^-last}},{{/-last}}{{/responses}} + ApiResponse(responseCode = "{{{code}}}", description = "{{#lambda.escapeDollar}}{{{message}}}{{/lambda.escapeDollar}}"{{#baseType}}, content = [Content({{#isArray}}array = ArraySchema({{/isArray}}schema = Schema(implementation = {{{baseType}}}::class)){{#isArray}}){{/isArray}}]{{/baseType}}){{^-last}},{{/-last}}{{/responses}} ]{{#hasAuthMethods}}, security = [ {{#authMethods}}SecurityRequirement(name = "{{name}}"{{#isOAuth}}, scopes = [ {{#scopes}}"{{scope}}"{{^-last}}, {{/-last}}{{/scopes}} ]{{/isOAuth}}){{^-last}},{{/-last}}{{/authMethods}} ]{{/hasAuthMethods}} ){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} @ApiOperation( - value = "{{{summary}}}", + value = "{{#lambda.escapeDollar}}{{{summary}}}{{/lambda.escapeDollar}}", nickname = "{{{operationId}}}", - notes = "{{{notes}}}"{{#returnBaseType}}, + notes = "{{#lambda.escapeDollar}}{{{notes}}}{{/lambda.escapeDollar}}"{{#returnBaseType}}, response = {{{.}}}::class{{/returnBaseType}}{{#returnContainer}}, responseContainer = "{{{.}}}"{{/returnContainer}}{{#hasAuthMethods}}, authorizations = [{{#authMethods}}Authorization(value = "{{name}}"{{#isOAuth}}, scopes = [{{#scopes}}AuthorizationScope(scope = "{{scope}}", description = "{{description}}"){{^-last}}, {{/-last}}{{/scopes}}]{{/isOAuth}}){{^-last}}, {{/-last}}{{/authMethods}}]{{/hasAuthMethods}} ) @ApiResponses( - value = [{{#responses}}ApiResponse(code = {{{code}}}, message = "{{{message}}}"{{#baseType}}, response = {{{.}}}::class{{/baseType}}{{#containerType}}, responseContainer = "{{{.}}}"{{/containerType}}){{^-last}}, {{/-last}}{{/responses}}] + value = [{{#responses}}ApiResponse(code = {{{code}}}, message = "{{#lambda.escapeDollar}}{{{message}}}{{/lambda.escapeDollar}}"{{#baseType}}, response = {{{.}}}::class{{/baseType}}{{#containerType}}, responseContainer = "{{{.}}}"{{/containerType}}){{^-last}}, {{/-last}}{{/responses}}] ){{/swagger1AnnotationLibrary}} @RequestMapping( method = [RequestMethod.{{httpMethod}}], - value = [PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}} /* "{{#lambdaEscapeInNormalString}}{{{path}}}{{/lambdaEscapeInNormalString}}" */]{{#singleContentTypes}}{{#hasProduces}}, + value = [PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}} /* "{{{path}}}" */]{{#singleContentTypes}}{{#hasProduces}}, produces = [{{#vendorExtensions.x-accepts}}"{{{.}}}"{{^-last}}, {{/-last}}{{/vendorExtensions.x-accepts}}]{{/hasProduces}}{{#hasConsumes}}, consumes = "{{{vendorExtensions.x-content-type}}}"{{/hasConsumes}}{{/singleContentTypes}}{{^singleContentTypes}}{{#hasProduces}}, produces = [{{#produces}}"{{{mediaType}}}"{{^-last}}, {{/-last}}{{/produces}}]{{/hasProduces}}{{#hasConsumes}}, @@ -131,7 +131,7 @@ interface {{classname}} { const val BASE_PATH: String = "{{=<% %>=}}<%contextPath%><%={{ }}=%>" {{/useRequestMappingOnInterface}} {{#operation}} - const val PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}}: String = "{{{path}}}" + const val PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}}: String = "{{#lambdaEscapeInNormalString}}{{{path}}}{{/lambdaEscapeInNormalString}}" {{/operation}} } } diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/bodyParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/bodyParams.mustache index b4f03475cd0b..c8f2f053320a 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/bodyParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/bodyParams.mustache @@ -1 +1 @@ -{{#isBodyParam}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"], defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"]){{/defaultValue}}{{/allowableValues}}{{/isContainer}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}, allowableValues = "{{{.}}}"{{/allowableValues}}{{/isContainer}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{>beanValidationBodyParams}}{{/useBeanValidation}} @RequestBody{{^required}}(required = false){{/required}} {{{paramName}}}: {{^reactive}}{{>optionalDataType}}{{/reactive}}{{#reactive}}{{^isArray}}{{>optionalDataType}}{{/isArray}}{{#isArray}}Flow<{{{baseType}}}>{{/isArray}}{{/reactive}}{{/isBodyParam}} \ No newline at end of file +{{#isBodyParam}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"], defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"]){{/defaultValue}}{{/allowableValues}}{{/isContainer}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}, allowableValues = "{{{.}}}"{{/allowableValues}}{{/isContainer}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{>beanValidationBodyParams}}{{/useBeanValidation}} @RequestBody{{^required}}(required = false){{/required}} {{{paramName}}}: {{^reactive}}{{>optionalDataType}}{{/reactive}}{{#reactive}}{{^isArray}}{{>optionalDataType}}{{/isArray}}{{#isArray}}Flow<{{{baseType}}}>{{/isArray}}{{/reactive}}{{/isBodyParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/cookieParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/cookieParams.mustache index 028264a18bcf..9bc91ea16229 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/cookieParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/cookieParams.mustache @@ -1 +1 @@ -{{#isCookieParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}@CookieValue(name = "{{baseName}}"{{^required}}, required = false{{/required}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{{paramName}}}: {{>optionalDataType}}{{/isCookieParam}} \ No newline at end of file +{{#isCookieParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}@CookieValue(name = "{{#lambdaEscapeInNormalString}}{{{baseName}}}{{/lambdaEscapeInNormalString}}"{{^required}}, required = false{{/required}}{{#defaultValue}}, defaultValue = "{{#lambda.escapeDollar}}{{{.}}}{{/lambda.escapeDollar}}"{{/defaultValue}}) {{{paramName}}}: {{>optionalDataType}}{{/isCookieParam}} \ No newline at end of file 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 5f597f12a591..dd5224fb60b8 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClass.mustache @@ -1,7 +1,7 @@ /** - * {{{description}}} + * {{{unescapedDescription}}} {{#vars}} - * @param {{name}} {{{description}}} + * @param {{name}} {{{unescapedDescription}}} {{/vars}} */{{#discriminator}} {{>typeInfoAnnotation}}{{/discriminator}} 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 ab575d4bf9d3..48119eac68c1 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassOptVar.mustache @@ -1,6 +1,6 @@ {{#useBeanValidation}}{{>beanValidation}}{{>beanValidationModel}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}} - @Schema({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{{description}}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} - @ApiModelProperty({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{/swagger1AnnotationLibrary}}{{#deprecated}} + @Schema({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} + @ApiModelProperty({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger1AnnotationLibrary}}{{#deprecated}} @Deprecated(message = ""){{/deprecated}}{{#vendorExtensions.x-field-extra-annotation}} {{{.}}}{{/vendorExtensions.x-field-extra-annotation}} - @get:JsonProperty("{{{baseName}}}"){{#isInherited}} override{{/isInherited}} {{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isArray}}{{baseType}}<{{/isArray}}{{classname}}.{{{nameInPascalCase}}}{{#isArray}}>{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{^defaultValue}}null{{/defaultValue}}{{#defaultValue}}{{^isNumber}}{{{defaultValue}}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}} \ No newline at end of file + @get:JsonProperty("{{#lambdaEscapeInNormalString}}{{{baseName}}}{{/lambdaEscapeInNormalString}}"){{#isInherited}} override{{/isInherited}} {{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isArray}}{{baseType}}<{{/isArray}}{{classname}}.{{{nameInPascalCase}}}{{#isArray}}>{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{^defaultValue}}null{{/defaultValue}}{{#defaultValue}}{{^isNumber}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}"){{/isNumber}}{{/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 92e2875ac08a..2aa5b66a96f7 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/dataClassReqVar.mustache @@ -1,5 +1,5 @@ {{#useBeanValidation}}{{>beanValidation}}{{>beanValidationModel}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}} - @Schema({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}required = true, {{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{{description}}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} - @ApiModelProperty({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}required = true, {{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{/swagger1AnnotationLibrary}}{{#vendorExtensions.x-field-extra-annotation}} + @Schema({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}required = true, {{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} + @ApiModelProperty({{#example}}example = "{{#lambdaRemoveLineBreak}}{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}{{/lambdaRemoveLineBreak}}", {{/example}}required = true, {{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger1AnnotationLibrary}}{{#vendorExtensions.x-field-extra-annotation}} {{{.}}}{{/vendorExtensions.x-field-extra-annotation}} - @get:JsonProperty("{{{baseName}}}", required = true){{#isInherited}} override{{/isInherited}} {{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isArray}}{{baseType}}<{{/isArray}}{{classname}}.{{{nameInPascalCase}}}{{#isArray}}>{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}}?{{/isNullable}}{{#defaultValue}} = {{^isNumber}}{{{defaultValue}}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{{defaultValue}}}"){{/isNumber}}{{/defaultValue}} \ No newline at end of file + @get:JsonProperty("{{#lambdaEscapeInNormalString}}{{{baseName}}}{{/lambdaEscapeInNormalString}}", required = true){{#isInherited}} override{{/isInherited}} {{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isArray}}{{baseType}}<{{/isArray}}{{classname}}.{{{nameInPascalCase}}}{{#isArray}}>{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}}?{{/isNullable}}{{#defaultValue}} = {{^isNumber}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{/isNumber}}{{#isNumber}}{{{dataType}}}("{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}"){{/isNumber}}{{/defaultValue}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache index 456af893718f..a4d6044d5bff 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/formParams.mustache @@ -1 +1 @@ -{{#isFormParam}}{{^isFile}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid {{/useBeanValidation}}{{#isModel}}@RequestPart{{/isModel}}{{^isModel}}@RequestParam{{/isModel}}(value = "{{baseName}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}) {{{paramName}}}: {{>optionalDataType}}{{/isFile}}{{#isFile}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}") {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "file detail") {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{/useBeanValidation}} @RequestPart("{{baseName}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}) {{{paramName}}}: {{>optionalDataType}}{{/isFile}}{{/isFormParam}} \ No newline at end of file +{{#isFormParam}}{{^isFile}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{unescapedDescription}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{#lambda.escapeDollar}}{{{unescapedDescription}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#lambda.escapeDollar}}{{{.}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{/defaultValue}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid {{/useBeanValidation}}{{#isModel}}@RequestPart{{/isModel}}{{^isModel}}@RequestParam{{/isModel}}(value = "{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}) {{{paramName}}}: {{>optionalDataType}}{{/isFile}}{{#isFile}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{unescapedDescription}}}{{/lambda.escapeDollar}}") {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "file detail") {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{/useBeanValidation}} @RequestPart("{{#lambda.escapeDollar}}{{baseName}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}) {{{paramName}}}: {{>optionalDataType}}{{/isFile}}{{/isFormParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/generatedCodeWarning.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/generatedCodeWarning.mustache new file mode 100644 index 000000000000..de30078ab3ab --- /dev/null +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/generatedCodeWarning.mustache @@ -0,0 +1,5 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) ({{{generatorVersion}}}). + * https://openapi-generator.tech + * Do not edit the class manually. + */ \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/headerParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/headerParams.mustache index 0c2678f1bf67..00bd70f7823a 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/headerParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/headerParams.mustache @@ -1 +1 @@ -{{#isHeaderParam}}{{#useBeanValidation}}{{>beanValidationCore}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}", `in` = ParameterIn.HEADER{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}@RequestHeader(value = "{{baseName}}", required = {{#required}}true{{/required}}{{^required}}false{{/required}}{{#defaultValue}}, defaultValue = {{^isString}}"{{{.}}}"{{/isString}}{{#isString}}{{#isEnum}}"{{{.}}}"{{/isEnum}}{{^isEnum}}{{{.}}}{{/isEnum}}{{/isString}}{{/defaultValue}}) {{{paramName}}}: {{>optionalDataType}}{{/isHeaderParam}} \ No newline at end of file +{{#isHeaderParam}}{{#useBeanValidation}}{{>beanValidationCore}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}", `in` = ParameterIn.HEADER{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}@RequestHeader(value = "{{baseName}}", required = {{#required}}true{{/required}}{{^required}}false{{/required}}{{#defaultValue}}, defaultValue = {{^isString}}"{{{.}}}"{{/isString}}{{#isString}}{{#isEnum}}"{{{.}}}"{{/isEnum}}{{^isEnum}}{{{.}}}{{/isEnum}}{{/isString}}{{/defaultValue}}) {{{paramName}}}: {{>optionalDataType}}{{/isHeaderParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceOptVar.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceOptVar.mustache index 3fa63ad64876..a2e30f2d7e3f 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceOptVar.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceOptVar.mustache @@ -1,5 +1,5 @@ {{#swagger2AnnotationLibrary}} - @get:Schema({{#example}}example = "{{{.}}}", {{/example}}{{#required}}requiredMode = Schema.RequiredMode.REQUIRED, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{{description}}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} - @get:ApiModelProperty({{#example}}example = "{{{.}}}", {{/example}}{{#required}}required = {{required}}, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{/swagger1AnnotationLibrary}}{{#vendorExtensions.x-field-extra-annotation}} + @get:Schema({{#example}}example = "{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}", {{/example}}{{#required}}requiredMode = Schema.RequiredMode.REQUIRED, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} + @get:ApiModelProperty({{#example}}example = "{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}", {{/example}}{{#required}}required = {{required}}, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger1AnnotationLibrary}}{{#vendorExtensions.x-field-extra-annotation}} {{{.}}}{{/vendorExtensions.x-field-extra-annotation}} - {{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{classname}}.{{nameInPascalCase}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? {{^discriminator}}= {{{defaultValue}}}{{^defaultValue}}null{{/defaultValue}}{{/discriminator}} + {{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{classname}}.{{nameInPascalCase}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? {{^discriminator}}= {{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^defaultValue}}null{{/defaultValue}}{{/discriminator}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceReqVar.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceReqVar.mustache index 8f0fb71ba319..8e1fc992e14a 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceReqVar.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/interfaceReqVar.mustache @@ -1,5 +1,5 @@ {{#swagger2AnnotationLibrary}} - @get:Schema({{#example}}example = "{{{.}}}", {{/example}}{{#required}}requiredMode = Schema.RequiredMode.REQUIRED, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{{description}}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} - @get:ApiModelProperty({{#example}}example = "{{{.}}}", {{/example}}{{#required}}required = {{required}}, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{{description}}}"){{/swagger1AnnotationLibrary}}{{#vendorExtensions.x-field-extra-annotation}} + @get:Schema({{#example}}example = "{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}", {{/example}}{{#required}}requiredMode = Schema.RequiredMode.REQUIRED, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}} + @get:ApiModelProperty({{#example}}example = "{{#lambdaEscapeInNormalString}}{{{.}}}{{/lambdaEscapeInNormalString}}", {{/example}}{{#required}}required = {{required}}, {{/required}}{{#isReadOnly}}readOnly = {{{isReadOnly}}}, {{/isReadOnly}}value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"){{/swagger1AnnotationLibrary}}{{#vendorExtensions.x-field-extra-annotation}} {{{.}}}{{/vendorExtensions.x-field-extra-annotation}} {{#isInherited}}override {{/isInherited}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{classname}}.{{nameInPascalCase}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}} diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/apiInterface.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/apiInterface.mustache index 876a558db0b9..1f0d5786ac67 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/apiInterface.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/apiInterface.mustache @@ -83,7 +83,7 @@ interface {{classname}} { const val BASE_PATH: String = "{{=<% %>=}}<%contextPath%><%={{ }}=%>" {{/useRequestMappingOnInterface}} {{#operation}} - const val PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}}: String = "{{{path}}}" + const val PATH_{{#lambda.uppercase}}{{#lambda.snakecase}}{{{operationId}}}{{/lambda.snakecase}}{{/lambda.uppercase}}: String = "{{#lambdaEscapeInNormalString}}{{{path}}}{{/lambdaEscapeInNormalString}}" {{/operation}} } } diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/httpInterfaceBodyParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/httpInterfaceBodyParams.mustache index e884046f7d6d..168d0b9b7146 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/httpInterfaceBodyParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/httpInterfaceBodyParams.mustache @@ -1 +1 @@ -{{#isBodyParam}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"], defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"]){{/defaultValue}}{{/allowableValues}}{{/isContainer}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}, allowableValues = "{{{.}}}"{{/allowableValues}}{{/isContainer}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{>beanValidationBodyParams}}{{/useBeanValidation}} @RequestBody{{^required}}(required = false){{/required}} {{{paramName}}}: {{>optionalDataType}}{{/isBodyParam}} \ No newline at end of file +{{#isBodyParam}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"], defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = ["{{{allowableValues}}}"]){{/defaultValue}}{{/allowableValues}}{{/isContainer}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{^isContainer}}{{#allowableValues}}, allowableValues = "{{{.}}}"{{/allowableValues}}{{/isContainer}}{{#defaultValue}}, defaultValue = "{{#lambda.escapeDollar}}{{{.}}}{{/lambda.escapeDollar}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{>beanValidationBodyParams}}{{/useBeanValidation}} @RequestBody{{^required}}(required = false){{/required}} {{{paramName}}}: {{>optionalDataType}}{{/isBodyParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/pathParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/pathParams.mustache index 2e28d18c78fa..0693a20ec36e 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/pathParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/pathParams.mustache @@ -1 +1 @@ -{{#isPathParam}}{{#useBeanValidation}}{{>beanValidationPathParams}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}@PathVariable("{{baseName}}") {{{paramName}}}: {{>optionalDataType}}{{/isPathParam}} \ No newline at end of file +{{#isPathParam}}{{#useBeanValidation}}{{>beanValidationPathParams}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{#defaultValue}}, defaultValue = "{{{.}}}"{{/defaultValue}}) {{/swagger1AnnotationLibrary}}@PathVariable("{{#lambdaEscapeInNormalString}}{{baseName}}{{/lambdaEscapeInNormalString}}") {{{paramName}}}: {{>optionalDataType}}{{/isPathParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/queryParams.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/queryParams.mustache index 27d7e286bb33..035e944ed193 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/queryParams.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/queryParams.mustache @@ -1 +1 @@ -{{#isQueryParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{{description}}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{^isContainer}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/defaultValue}}{{/isContainer}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{/useBeanValidation}}{{^isModel}} @RequestParam(value = "{{baseName}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}{{^isContainer}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{{defaultValue}}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/defaultValue}}{{/isContainer}}){{/isModel}}{{#isDate}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE){{/isDate}}{{#isDateTime}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME){{/isDateTime}} {{{paramName}}}: {{>optionalDataType}}{{/isQueryParam}} \ No newline at end of file +{{#isQueryParam}}{{#useBeanValidation}}{{>beanValidationQueryParams}}{{/useBeanValidation}}{{#swagger2AnnotationLibrary}}@Parameter(description = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}{{#defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]{{^isContainer}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/isContainer}}){{/defaultValue}}{{/allowableValues}}{{#allowableValues}}{{^defaultValue}}, schema = Schema(allowableValues = [{{#values}}"{{{.}}}"{{^-last}}, {{/-last}}{{/values}}]){{/defaultValue}}{{/allowableValues}}{{^allowableValues}}{{#defaultValue}}{{^isContainer}}, schema = Schema(defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}){{/isContainer}}{{/defaultValue}}{{/allowableValues}}) {{/swagger2AnnotationLibrary}}{{#swagger1AnnotationLibrary}}@ApiParam(value = "{{#lambda.escapeDollar}}{{{description}}}{{/lambda.escapeDollar}}"{{#required}}, required = true{{/required}}{{#allowableValues}}, allowableValues = "{{#values}}{{{.}}}{{^-last}}, {{/-last}}{{/values}}"{{/allowableValues}}{{^isContainer}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/defaultValue}}{{/isContainer}}) {{/swagger1AnnotationLibrary}}{{#useBeanValidation}}@Valid{{/useBeanValidation}}{{^isModel}} @RequestParam(value = "{{#lambdaEscapeInNormalString}}{{baseName}}{{/lambdaEscapeInNormalString}}"{{#required}}, required = true{{/required}}{{^required}}, required = false{{/required}}{{^isContainer}}{{#defaultValue}}, defaultValue = {{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{#lambda.escapeDollar}}{{{defaultValue}}}{{/lambda.escapeDollar}}{{^isString}}"{{/isString}}{{#isString}}{{#isEnum}}"{{/isEnum}}{{/isString}}{{/defaultValue}}{{/isContainer}}){{/isModel}}{{#isDate}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE){{/isDate}}{{#isDateTime}} @org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME){{/isDateTime}} {{{paramName}}}: {{>optionalDataType}}{{/isQueryParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/kotlin-spring/service.mustache b/modules/openapi-generator/src/main/resources/kotlin-spring/service.mustache index 309be55743b4..3aa62e4e17f1 100644 --- a/modules/openapi-generator/src/main/resources/kotlin-spring/service.mustache +++ b/modules/openapi-generator/src/main/resources/kotlin-spring/service.mustache @@ -11,22 +11,22 @@ interface {{classname}}Service { {{#operation}} /** - * {{httpMethod}} {{{path}}}{{#summary}} : {{.}}{{/summary}} - {{#notes}} - * {{.}} - {{/notes}} + * {{httpMethod}} {{{path}}}{{#unescapedSummary}} : {{{.}}}{{/unescapedSummary}} + {{#unescapedNotes}} + * {{{.}}} + {{/unescapedNotes}} * {{#allParams}} - * @param {{{paramName}}} {{description}}{{#required}} (required){{/required}}{{^required}} (optional{{#defaultValue}}, default to {{.}}{{/defaultValue}}){{/required}} + * @param {{{paramName}}} {{{unescapedDescription}}}{{#required}} (required){{/required}}{{^required}} (optional{{#defaultValue}}, default to {{^isString}}{{{.}}}{{/isString}}{{#isString}}{{#lambda.escapeDollar}}{{{.}}}{{/lambda.escapeDollar}}{{/isString}}{{/defaultValue}}){{/required}} {{/allParams}} - * @return {{#responses}}{{message}} (status code {{code}}){{^-last}} + * @return {{#responses}}{{{unescapedMessage}}} (status code {{code}}){{^-last}} * or {{/-last}}{{/responses}} {{#isDeprecated}} * @deprecated {{/isDeprecated}} {{#externalDocs}} * {{description}} - * @see {{summary}} Documentation + * @see {{{summary}}} Documentation {{/externalDocs}} * @see {{classname}}#{{operationId}} */ diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/TestUtils.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/TestUtils.java index b0b0396a2ab9..5068672415f2 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/TestUtils.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/TestUtils.java @@ -208,7 +208,7 @@ public static void assertFileNotContains(Path path, String... lines) { String file = linearize(generatedFile); assertNotNull(file); for (String line : lines) - assertFalse(file.contains(linearize(line))); + assertFalse(file.contains(linearize(line)), "File '" + path + "' contains line [" + line + "] when it should not"); } public static void assertFileNotExists(Path path) { 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 c9843b2a0169..6fa996631a5d 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,14 +1,11 @@ package org.openapitools.codegen.kotlin.spring; import com.google.common.collect.ImmutableMap; -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.apache.commons.io.FileUtils; import org.assertj.core.api.Assertions; -import org.jetbrains.annotations.NotNull; import org.openapitools.codegen.ClientOptInput; import org.openapitools.codegen.CodegenConstants; import org.openapitools.codegen.DefaultGenerator; @@ -95,103 +92,85 @@ public void testInitialConfigValues() throws Exception { } @Test - public void testNoRequestMappingAnnotation_spring_cloud_default() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - - final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.setLibrary("spring-cloud"); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/feat13488_use_kotlinSpring_with_springCloud.yaml")) - .config(codegen)) - .generate(); - - // Check that the @RequestMapping annotation is not generated in the Api file - assertFileNotContains( - Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "@RequestMapping(\"\\${api.base-path" + public void testNoRequestMappingAnnotation_spring_cloud_default() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/feat13488_use_kotlinSpring_with_springCloud.yaml", + Map.of(CodegenConstants.LIBRARY, "spring-cloud"), + Map.of()); + assertGeneratedFilesNotContain( + Map.of( // Check that the @RequestMapping annotation is not generated in the Api file + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("@RequestMapping(\"\\${api.base-path") + ) ); } @Test - public void testNoRequestMappingAnnotationNone() throws IOException { - File output = generatePetstoreWithRequestMappingMode(KotlinSpringServerCodegen.RequestMappingMode.none); - - // Check that the @RequestMapping annotation is not generated in the Api file - assertFileNotContains( - Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApi.kt"), - "@RequestMapping(\"\\${" - ); - // Check that the @RequestMapping annotation is not generated in the ApiController file - assertFileNotContains( - Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApiController.kt"), - "@RequestMapping(\"\\${" + public void testNoRequestMappingAnnotationNone() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + DELEGATE_PATTERN, true, + USE_TAGS, true, + REQUEST_MAPPING_OPTION, "none" + ), Map.of()); + assertGeneratedFilesNotContain( + Map.of( // Check that the @RequestMapping annotation is not generated in the Api file + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of("@RequestMapping(\"\\${"), + // Check that the @RequestMapping annotation is not generated in the ApiController file + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of("@RequestMapping(\"\\${") + ) ); } @Test - public void testNoRequestMappingAnnotationController() throws IOException { - File output = generatePetstoreWithRequestMappingMode(KotlinSpringServerCodegen.RequestMappingMode.controller); - - // Check that the @RequestMapping annotation is not generated in the Api file - assertFileNotContains( - Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApi.kt"), - "@RequestMapping(\"\\${" + public void testNoRequestMappingAnnotationController() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + DELEGATE_PATTERN, true, + USE_TAGS, true, + REQUEST_MAPPING_OPTION, "controller" + ), Map.of()); + assertGeneratedFilesNotContain( + Map.of( // Check that the @RequestMapping annotation is not generated in the Api file + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of("@RequestMapping(\"\\${") + ) ); - // Check that the @RequestMapping annotation is generated in the ApiController file - assertFileContains( - Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApiController.kt"), - "@RequestMapping(\"\\${openapi.openAPIPetstore.base-path:\\${api.base-path:$BASE_PATH}}\")", - " companion object {\n" - + " //for your own safety never directly reuse these path definitions in tests\n" - + " const val BASE_PATH: String = \"/v2\"\n" - + " }" + assertGeneratedFilesContain( + Map.of( // Check that the @RequestMapping annotation is generated in the ApiController file + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of("@RequestMapping(\"\\${openapi.openAPIPetstore.base-path:\\${api.base-path:$BASE_PATH}}\")", + " companion object {\n" + + " //for your own safety never directly reuse these path definitions in tests\n" + + " const val BASE_PATH: String = \"/v2\"\n" + + " }") + ) ); } @Test - public void testNoRequestMappingAnnotationApiInterface() throws IOException { - File output = generatePetstoreWithRequestMappingMode(KotlinSpringServerCodegen.RequestMappingMode.api_interface); + public void testNoRequestMappingAnnotationApiInterface() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + DELEGATE_PATTERN, true, + USE_TAGS, true, + REQUEST_MAPPING_OPTION, "api_interface" + ), Map.of()); - // Check that the @RequestMapping annotation is generated in the Api file - assertFileContains( - Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApi.kt"), - "@RequestMapping(\"\\${openapi.openAPIPetstore.base-path:\\${api.base-path:$BASE_PATH}}\")", - " companion object {\n" - + " //for your own safety never directly reuse these path definitions in tests\n" - + " const val BASE_PATH: String = \"/v2\"" - ); - // Check that the @RequestMapping annotation is not generated in the ApiController file - assertFileNotContains( - Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApiController.kt"), - "@RequestMapping(\"\\${" + assertGeneratedFilesContain( + Map.of( + // Check that the @RequestMapping annotation is generated in the Api file + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + "@RequestMapping(\"\\${openapi.openAPIPetstore.base-path:\\${api.base-path:$BASE_PATH}}\")", + " companion object {\n" + + " //for your own safety never directly reuse these path definitions in tests\n" + + " const val BASE_PATH: String = \"/v2\"") + ) ); - } - - private static @NotNull File generatePetstoreWithRequestMappingMode(KotlinSpringServerCodegen.RequestMappingMode requestMappingMode) throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.REQUEST_MAPPING_OPTION, requestMappingMode); - - new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen) + assertGeneratedFilesNotContain( + Map.of( + // Check that the @RequestMapping annotation is not generated in the ApiController file + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + "@RequestMapping(\"\\${") ) - .generate(); - return output; + ); } @Test - public void testSettersForConfigValues() throws Exception { + public void testSettersForConfigValues() { final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); codegen.setModelPackage("xx.yyyyyyyy.model"); codegen.setApiPackage("xx.yyyyyyyy.api"); @@ -231,7 +210,7 @@ public void testSettersForConfigValues() throws Exception { } @Test - public void testAdditionalPropertiesPutForConfigValues() throws Exception { + public void testAdditionalPropertiesPutForConfigValues() { final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); codegen.additionalProperties().put(CodegenConstants.MODEL_PACKAGE, "xyz.yyyyy.mmmmm.model"); codegen.additionalProperties().put(CodegenConstants.API_PACKAGE, "xyz.yyyyy.aaaaa.api"); @@ -301,398 +280,235 @@ public void testDelegatePattern() { } @Test(description = "test delegate with tags") - public void delegateWithTags() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); //may be move to /build - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); + public void delegateWithTags() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/issue5497-use-tags-kotlin.yaml", Map.of( + KotlinSpringServerCodegen.DELEGATE_PATTERN, true, + KotlinSpringServerCodegen.USE_TAGS, true + ), Map.of()); + + assertGeneratedFilesExist(List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2ApiController.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt") + )); + } - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue5497-use-tags-kotlin.yaml")) - .config(codegen) + @Test(description = "test delegate reactive with tags") + public void delegateReactiveWithTags() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/issue7325-use-delegate-reactive-tags-kotlin.yaml", Map.of( + KotlinSpringServerCodegen.DELEGATE_PATTERN, true, + KotlinSpringServerCodegen.REACTIVE, true, + KotlinSpringServerCodegen.USE_TAGS, true + ), Map.of()); + + assertGeneratedFilesExist(List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2Api.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2ApiController.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV3Api.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV3ApiController.kt"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV3ApiDelegate.kt") + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("suspend fun"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("suspend fun"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2Api.kt"), List.of("import kotlinx.coroutines.flow.Flow", "ResponseEntity>"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt"), List.of("import kotlinx.coroutines.flow.Flow", "ResponseEntity>"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV3Api.kt"), List.of("import kotlinx.coroutines.flow.Flow", "requestBody: Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV3ApiDelegate.kt"), List.of("import kotlinx.coroutines.flow.Flow", "suspend fun", "requestBody: Flow" + ) + ) + ); + assertGeneratedFilesNotContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("exchange"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("ApiUtil"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2Api.kt"), List.of("exchange"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt"), List.of("suspend fun", "ApiUtil"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV3Api.kt"), List.of("exchange"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV3ApiDelegate.kt"), List.of("ApiUtil" + ) ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV2ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt") ); } - @Test(description = "test delegate reactive with tags") - public void delegateReactiveWithTags() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); //may be move to /build - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.REACTIVE, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); - - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue7325-use-delegate-reactive-tags-kotlin.yaml")) - .config(codegen) - ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV2Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV2ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV3Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV3ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV3ApiDelegate.kt") - ); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "suspend fun"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "exchange"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "suspend fun"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "ApiUtil"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV2Api.kt"), - "import kotlinx.coroutines.flow.Flow", "ResponseEntity>"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV2Api.kt"), - "exchange"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt"), - "import kotlinx.coroutines.flow.Flow", "ResponseEntity>"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV2ApiDelegate.kt"), - "suspend fun", "ApiUtil"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV3Api.kt"), - "import kotlinx.coroutines.flow.Flow", "requestBody: Flow"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV3Api.kt"), - "exchange"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV3ApiDelegate.kt"), - "import kotlinx.coroutines.flow.Flow", "suspend fun", "requestBody: Flow"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV3ApiDelegate.kt"), - "ApiUtil"); - } - - @Test - public void testNullableMultipartFile() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - OpenAPI openAPI = new OpenAPIParser() - .readLocation("src/test/resources/3_0/kotlin/feat-multipartfile_nullable.yaml", null, new ParseOptions()).getOpenAPI(); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/NullableMultipartfileApiController.kt"), - "file: org.springframework.web.multipart.MultipartFile?" - + " )"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/NullableMultipartfileArrayApiController.kt"), - "files: Array?" - + " )"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/NonNullableMultipartfileApiController.kt"), - "file: org.springframework.web.multipart.MultipartFile" - + " )"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/NonNullableMultipartfileArrayApiController.kt"), - "files: Array" - + " )"); + @Test + public void testNullableMultipartFile() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/feat-multipartfile_nullable.yaml", + Map.of(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/NullableMultipartfileApiController.kt"), List.of( + "file: org.springframework.web.multipart.MultipartFile?" + + " )"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/NullableMultipartfileArrayApiController.kt"), List.of( + "files: Array?" + + " )"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/NonNullableMultipartfileApiController.kt"), List.of( + "file: org.springframework.web.multipart.MultipartFile" + + " )"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/NonNullableMultipartfileArrayApiController.kt"), List.of( + "files: Array" + + " )" + ) + ) + ); } @Test - public void arrayItemsCanBeNullable() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - OpenAPI openAPI = new OpenAPIParser() - .readLocation("src/test/resources/3_0/array-nullable-items.yaml", null, new ParseOptions()).getOpenAPI(); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/ArrayWithNullableItemsModel.kt"), "List"); + public void arrayItemsCanBeNullable() { + Path apiSources = generateApiSources("src/test/resources/3_0/array-nullable-items.yaml", + Map.of(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"), + Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of(apiSources.resolve("src/main/kotlin/org/openapitools/model/ArrayWithNullableItemsModel.kt"), List.of("List")) + ); } @Test - public void doNotGenerateRequestParamForObjectQueryParam() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - OpenAPI openAPI = new OpenAPIParser() - .readLocation("src/test/resources/3_0/objectQueryParam.yaml", null, new ParseOptions()).getOpenAPI(); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - assertFileNotContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PonyApiController.kt"), "@RequestParam"); + public void doNotGenerateRequestParamForObjectQueryParam() { + Path apiSources = generateApiSources("src/test/resources/3_0/objectQueryParam.yaml", + Map.of(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesNotContain( + Map.of(apiSources.resolve("src/main/kotlin/org/openapitools/api/PonyApiController.kt"), List.of("@RequestParam")) + ); } @Test - public void doGenerateRequestParamForSimpleParam() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - OpenAPI openAPI = new OpenAPIParser() - .readLocation("src/test/resources/3_0/issue_3248.yaml", null, new ParseOptions()).getOpenAPI(); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/MonkeysApiController.kt"), "@RequestParam"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/ElephantsApiController.kt"), "@RequestParam"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/ZebrasApiController.kt"), "@RequestParam"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/BearsApiController.kt"), "@RequestParam"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/CamelsApiController.kt"), "@RequestParam"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PandasApiController.kt"), "@RequestParam"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/CrocodilesApiController.kt"), "@RequestParam"); - assertFileContains(Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PolarBearsApiController.kt"), "@RequestParam"); + public void doGenerateRequestParamForSimpleParam() { + Path apiSources = generateApiSources("src/test/resources/3_0/issue_3248.yaml", + Map.of(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/MonkeysApiController.kt"), List.of("@RequestParam"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/ElephantsApiController.kt"), List.of("@RequestParam"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/ZebrasApiController.kt"), List.of("@RequestParam"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/BearsApiController.kt"), List.of("@RequestParam"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/CamelsApiController.kt"), List.of("@RequestParam"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/PandasApiController.kt"), List.of("@RequestParam"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/CrocodilesApiController.kt"), List.of("@RequestParam"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/PolarBearsApiController.kt"), List.of("@RequestParam") + ) + ); } @Test - public void generateFormatForDateAndDateTimeQueryParam() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - OpenAPI openAPI = new OpenAPIParser() - .readLocation("src/test/resources/3_0/issue_2053.yaml", null, new ParseOptions()).getOpenAPI(); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - generator.opts(input).generate(); - - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/ElephantsApiController.kt"), - "@org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE)" - ); - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/ZebrasApiController.kt"), - "@org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME)" + public void generateFormatForDateAndDateTimeQueryParam() { + Path apiSources = generateApiSources("src/test/resources/3_0/issue_2053.yaml", + Map.of(CXFServerFeatures.LOAD_TEST_DATA_FROM_FILE, "true"), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/ElephantsApiController.kt"), + List.of("@org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE)"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/ZebrasApiController.kt"), + List.of("@org.springframework.format.annotation.DateTimeFormat(iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME)") + ) ); } @Test(description = "test bean qualifiers") - public void beanQualifiers() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.BEAN_QUALIFIERS, true); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/bean-qualifiers.yaml")) - .config(codegen)) - .generate(); - - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PingApiController.kt"), - "@RestController(\"org.openapitools.api.PingApiController\")" + public void beanQualifiers() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/bean-qualifiers.yaml", Map.of(KotlinSpringServerCodegen.BEAN_QUALIFIERS, true), Map.of()); + assertGeneratedFilesContain( + Map.of(apiSources.resolve("src/main/kotlin/org/openapitools/api/PingApiController.kt"), List.of("@RestController(\"org.openapitools.api.PingApiController\")")) ); } @Test(description = "test skip default interface") - public void skipDefaultInterface() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.INTERFACE_ONLY, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.SKIP_DEFAULT_INTERFACE, true); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/skip-default-interface.yaml")) - .config(codegen)) - .generate(); - - assertFileNotContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PingApi.kt"), - "return " + public void skipDefaultInterface() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/skip-default-interface.yaml", Map.of( + KotlinSpringServerCodegen.INTERFACE_ONLY, true, + KotlinSpringServerCodegen.SKIP_DEFAULT_INTERFACE, true + ), Map.of()); + assertGeneratedFilesNotContain( + Map.of(apiSources.resolve("src/main/kotlin/org/openapitools/api/PingApi.kt"), List.of("return ")) ); } @Test(description = "test cookie parameter generation on interface apis") - public void cookieParameterGenerationApis() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.INTERFACE_ONLY, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.SKIP_DEFAULT_INTERFACE, true); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore-with-fake-endpoints-for-testing-with-cookie.yaml")) - .config(codegen)) - .generate(); - - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/FakeApi.kt"), - "@CookieValue" - ); + public void cookieParameterGenerationApis() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore-with-fake-endpoints-for-testing-with-cookie.yaml", Map.of( + KotlinSpringServerCodegen.INTERFACE_ONLY, true, + KotlinSpringServerCodegen.SKIP_DEFAULT_INTERFACE, true + ), Map.of()); + assertGeneratedFilesContain( + Map.of(apiSources.resolve("src/main/kotlin/org/openapitools/api/FakeApi.kt"), List.of("@CookieValue"))); } @Test(description = "test cookie parameter generation on controllers") - public void cookieParameterGenerationControllers() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore-with-fake-endpoints-for-testing-with-cookie.yaml")) - .config(codegen)) - .generate(); - - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/FakeApiController.kt"), - "@CookieValue" - ); + public void cookieParameterGenerationControllers() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore-with-fake-endpoints-for-testing-with-cookie.yaml", Map.of(), Map.of()); + assertGeneratedFilesContain( + Map.of(apiSources.resolve("src/main/kotlin/org/openapitools/api/FakeApiController.kt"), List.of("@CookieValue"))); } @Test(description = "use Spring boot 3 & jakarta extension") - public void useSpringBoot3() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_SPRING_BOOT3, true); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/feat13578_use_springboot3_jakarta_extension.yaml")) - .config(codegen)) - .generate(); - - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/ApiUtil.kt"), - "import jakarta.servlet.http.HttpServletResponse" - ); - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/Exceptions.kt"), - "import jakarta.validation.ConstraintViolationException" - ); - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PingApiController.kt"), - "import jakarta.validation.Valid" + public void useSpringBoot3() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/feat13578_use_springboot3_jakarta_extension.yaml", Map.of( + KotlinSpringServerCodegen.USE_SPRING_BOOT3, true + ), Map.of()); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/ApiUtil.kt"), List.of("import jakarta.servlet.http.HttpServletResponse"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/Exceptions.kt"), List.of("import jakarta.validation.ConstraintViolationException"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/PingApiController.kt"), List.of("import jakarta.validation.Valid") + ) ); } @Test(description = "multi-line descriptions should be supported for operations") - public void multiLineOperationDescription() throws IOException { + public void multiLineOperationDescription() { testMultiLineOperationDescription(false); } @Test(description = "multi-line descriptions should be supported for operations (interface-only)") - public void multiLineOperationDescriptionInterfaceOnly() throws IOException { + public void multiLineOperationDescriptionInterfaceOnly() { testMultiLineOperationDescription(true); } - private static void testMultiLineOperationDescription(final boolean isInterfaceOnly) throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.INTERFACE_ONLY, - isInterfaceOnly); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue4111-multiline-operation-description.yaml")) - .config(codegen)) - .generate(); + private void testMultiLineOperationDescription(final boolean isInterfaceOnly) { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/issue4111-multiline-operation-description.yaml", Map.of( + KotlinSpringServerCodegen.INTERFACE_ONLY, isInterfaceOnly + ), Map.of()); final String pingApiFileName; if (isInterfaceOnly) { @@ -700,110 +516,63 @@ private static void testMultiLineOperationDescription(final boolean isInterfaceO } else { pingApiFileName = "PingApiController.kt"; } - assertFileContains( - Paths.get( - outputPath + "/src/main/kotlin/org/openapitools/api/" + pingApiFileName), - "description = \"\"\"# Multi-line descriptions\n" - + "\n" - + "This is an example of a multi-line description.\n" - + "\n" - + "It:\n" - + "- has multiple lines\n" - + "- uses Markdown (CommonMark) for rich text representation\"\"\"" + + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/" + pingApiFileName), + List.of( + "description = \"\"\"# Multi-line descriptions\n" + + "\n" + + "This is an example of a multi-line description.\n" + + "\n" + + "It:\n" + + "- has multiple lines\n" + + "- uses Markdown (CommonMark) for rich text representation\"\"\"") + ) ); } @Test(description = "use get Annotation use-site target on kotlin interface attributes") - public void useTargetOnInterfaceAnnotations() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue3596-use-correct-get-annotation-target.yaml")) - .config(codegen)) - .generate(); - - assertFileNotContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@Schema(example = \"null\", description = \"\")" - ); - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@get:Schema(example = \"null\", description = \"\")" - ); - assertFileNotContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@Schema(example = \"null\", requiredMode = Schema.RequiredMode.REQUIRED, description = \"\")" + public void useTargetOnInterfaceAnnotations() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/issue3596-use-correct-get-annotation-target.yaml", Map.of(), Map.of()); + Path animalDto = apiSources.resolve("src/main/kotlin/org/openapitools/model/Animal.kt"); + assertGeneratedFilesContain( + Map.of( + animalDto, List.of("@get:Schema(example = \"null\", description = \"\")", "@get:Schema(example = \"null\", requiredMode = Schema.RequiredMode.REQUIRED, description = \"\")") + ) ); - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@get:Schema(example = \"null\", requiredMode = Schema.RequiredMode.REQUIRED, description = \"\")" + assertGeneratedFilesNotContain( + Map.of( + animalDto, List.of("@Schema(example = \"null\", description = \"\")", "@Schema(example = \"null\", requiredMode = Schema.RequiredMode.REQUIRED, description = \"\")") + ) ); } @Test(description = "use get Annotation use-site target on kotlin interface attributes (swagger1)") - public void useTargetOnInterfaceAnnotationsWithSwagger1() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(ANNOTATION_LIBRARY, AnnotationLibrary.SWAGGER1.toCliOptValue()); - codegen.additionalProperties().put(DOCUMENTATION_PROVIDER, DocumentationProvider.SPRINGFOX.toCliOptValue()); - - new DefaultGenerator().opts(new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue3596-use-correct-get-annotation-target.yaml")) - .config(codegen)) - .generate(); - - assertFileNotContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@ApiModelProperty(example = \"null\", value = \"\")" + public void useTargetOnInterfaceAnnotationsWithSwagger1() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/issue3596-use-correct-get-annotation-target.yaml", Map.of( + ANNOTATION_LIBRARY, AnnotationLibrary.SWAGGER1.toCliOptValue(), + DOCUMENTATION_PROVIDER, DocumentationProvider.SPRINGFOX.toCliOptValue() + ), Map.of()); + Path animalDto = apiSources.resolve("src/main/kotlin/org/openapitools/model/Animal.kt"); + assertGeneratedFilesContain( + Map.of(animalDto, List.of("@get:ApiModelProperty(example = \"null\", value = \"\")", "@get:ApiModelProperty(example = \"null\", required = true, value = \"\")")) ); - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@get:ApiModelProperty(example = \"null\", value = \"\")" - ); - assertFileNotContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@ApiModelProperty(example = \"null\", required = true, value = \"\")" - ); - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Animal.kt"), - "@get:ApiModelProperty(example = \"null\", required = true, value = \"\")" + assertGeneratedFilesNotContain( + Map.of(animalDto, List.of("@ApiModelProperty(example = \"null\", value = \"\")", "@ApiModelProperty(example = \"null\", required = true, value = \"\")")) ); } @Test - public void useBeanValidationGenerateAnnotationsForRequestBody() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - - OpenAPI openAPI = new OpenAPIParser() - .readLocation("src/test/resources/bugs/issue_13932.yml", null, new ParseOptions()).getOpenAPI(); - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.INTERFACE_ONLY, "true"); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_BEANVALIDATION, "true"); - codegen.additionalProperties().put(CodegenConstants.MODEL_PACKAGE, "xyz.model"); - codegen.additionalProperties().put(CodegenConstants.API_PACKAGE, "xyz.controller"); - - ClientOptInput input = new ClientOptInput() - .openAPI(openAPI) - .config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - Map files = generator.opts(input).generate().stream() - .collect(Collectors.toMap(File::getName, Function.identity())); - - assertFileContains( - Paths.get(files.get("AddApi.kt").getAbsolutePath()), - "@Min(value=2)" + public void useBeanValidationGenerateAnnotationsForRequestBody() { + Path apiSources = generateApiSources("src/test/resources/bugs/issue_13932.yml", Map.of( + KotlinSpringServerCodegen.INTERFACE_ONLY, "true", + KotlinSpringServerCodegen.USE_BEANVALIDATION, "true", + CodegenConstants.MODEL_PACKAGE, "xyz.model", + CodegenConstants.API_PACKAGE, "xyz.controller" + ), Map.of()); + assertGeneratedFilesContain( + Map.of(apiSources.resolve("src/main/kotlin/xyz/controller/AddApi.kt"), List.of("@Min(value=2)")) ); } @@ -842,571 +611,370 @@ public void contractWithResolvedInnerEnumContainsEnumConverter() throws IOExcept } @Test - public void givenMultipartFormArray_whenGenerateDelegateAndService_thenParameterIsCreatedAsListOfMultipartFile() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/kotlin/petstore-with-tags.yaml"); - final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOpenAPI(openAPI); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.setDelegatePattern(true); - codegen.setServiceInterface(true); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path delegateFile = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"); - assertFileContains(delegateFile, "additionalMetadata: kotlin.String?"); - assertFileContains(delegateFile, "images: Array"); - - Path controllerFile = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PetApi.kt"); - assertFileContains(controllerFile, "images: Array"); - - Path serviceFile = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PetApiService.kt"); - assertFileContains(serviceFile, "images: Array"); - } - - @Test - public void givenOctetStreamResponseType_whenGenerateServer_thenReturnTypeIsResource() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/kotlin/petstore-with-tags.yaml"); - final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOpenAPI(openAPI); - codegen.setOutputDir(output.getAbsolutePath()); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path outputFilepath = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PetApiController.kt"); - - assertFileContains(outputFilepath, "): ResponseEntity"); - } + public void givenMultipartFormArray_whenGenerateDelegateAndService_thenParameterIsCreatedAsListOfMultipartFile() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore-with-tags.yaml", Map.of( + KotlinSpringServerCodegen.SERVICE_INTERFACE, true, + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of("additionalMetadata: kotlin.String?", "images: Array"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of("images: Array"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiService.kt"), List.of("images: Array") + ) + ); + } @Test - public void givenMultipartForm_whenGenerateReactiveServer_thenParameterAreCreatedAsRequestPart() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/kotlin/petstore-with-tags.yaml"); - final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOpenAPI(openAPI); - codegen.setOutputDir(output.getAbsolutePath()); - - ClientOptInput input = new ClientOptInput(); - input.openAPI(openAPI); - input.config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path outputFilepath = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/PetApiController.kt"); - - assertFileContains(outputFilepath, - "@Parameter(description = \"Additional data to pass to server\") @Valid @RequestParam(value = \"additionalMetadata\", required = false) additionalMetadata: kotlin.String?"); - assertFileContains(outputFilepath, - "@Parameter(description = \"image to upload\") @Valid @RequestPart(\"image\", required = false) image: org.springframework.web.multipart.MultipartFile"); - + public void givenOctetStreamResponseType_whenGenerateServer_thenReturnTypeIsResource() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore-with-tags.yaml", Map.of(), Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of("): ResponseEntity") + ) + ); } @Test - public void overridePropertyFunction() throws IOException { - - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.SERIALIZABLE_MODEL, true); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/bugs/issue_20228.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - assertFileContains( - Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Pony.kt"), - "override val nameOpt", "override val nameReq" + public void givenMultipartForm_whenGenerateReactiveServer_thenParameterAreCreatedAsRequestPart() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore-with-tags.yaml", Map.of(), Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), + List.of("@Parameter(description = \"Additional data to pass to server\") @Valid @RequestParam(value = \"additionalMetadata\", required = false) additionalMetadata: kotlin.String?", + "@Parameter(description = \"image to upload\") @Valid @RequestPart(\"image\", required = true) image: org.springframework.web.multipart.MultipartFile") + ) ); } @Test - public void generateSerializableModel() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.SERIALIZABLE_MODEL, true); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Pet.kt"); - assertFileContains( - path, - "import java.io.Serializable", - ") : Serializable {", - "private const val serialVersionUID: kotlin.Long = 1" - ); + public void overridePropertyFunction() { + Path apiSources = generateApiSources("src/test/resources/bugs/issue_20228.yaml", Map.of( + CodegenConstants.SERIALIZABLE_MODEL, true + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "false", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of(apiSources.resolve("src/main/kotlin/org/openapitools/model/Pony.kt"), List.of("override val nameOpt", "override val nameReq"))); } @Test - public void generateSerializableModelWithXimplements() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.SERIALIZABLE_MODEL, true); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Dog.kt"); - assertFileContains( - path, - "import java.io.Serializable", - "@get:JsonProperty(\"likesFetch\", required = true) override val likesFetch: kotlin.Boolean,", - ") : Pet, Serializable, com.some.pack.Fetchable {", - "private const val serialVersionUID: kotlin.Long = 1" + public void generateSerializableModel() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + CodegenConstants.SERIALIZABLE_MODEL, true + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "false", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/model/Pet.kt"), + List.of("import java.io.Serializable", + ") : Serializable {", + "private const val serialVersionUID: kotlin.Long = 1") + ) ); } @Test - public void generateHttpInterfaceReactiveWithReactorResponseEntity() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-declarative-http-interface"); - codegen.additionalProperties().put(REACTIVE, true); - codegen.additionalProperties().put(DECLARATIVE_INTERFACE_REACTIVE_MODE, "reactor"); - codegen.additionalProperties().put(USE_RESPONSE_ENTITY, true); - codegen.additionalProperties().put(REQUEST_MAPPING_OPTION, "none"); - codegen.additionalProperties().put(USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); - assertFileContains( - path, - "import reactor.core.publisher.Flux\n" - + "import reactor.core.publisher.Mono", - " @HttpExchange(\n" - + " url = PATH_GET_INVENTORY /* \"/store/inventory\" */,\n" - + " method = \"GET\"\n" - + " )\n" - + " fun getInventory(\n" - + " ): Mono>>", - " @HttpExchange(\n" - + " url = PATH_DELETE_ORDER /* \"/store/order/{orderId}\" */,\n" - + " method = \"DELETE\"\n" - + " )\n" - + " fun deleteOrder(\n" - + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" - + " ): Mono>", - " @HttpExchange(\n" - + " url = PATH_PLACE_ORDER /* \"/store/order\" */,\n" - + " method = \"POST\"\n" - + " )\n" - + " fun placeOrder(\n" - + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" - + " ): Mono>", - " companion object {\n" - + " //for your own safety never directly reuse these path definitions in tests\n" - + " const val PATH_DELETE_ORDER: String = \"/store/order/{orderId}\"\n" - + " const val PATH_GET_INVENTORY: String = \"/store/inventory\"\n" - + " const val PATH_GET_ORDER_BY_ID: String = \"/store/order/{orderId}\"\n" - + " const val PATH_PLACE_ORDER: String = \"/store/order\"\n" - + " }" - ); - assertFileNotContains( - path, - "suspend" - ); - } - - @Test - public void generateHttpInterfaceReactiveWithCoroutinesResponseEntity() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-declarative-http-interface"); - codegen.additionalProperties().put(REACTIVE, true); - codegen.additionalProperties().put(DECLARATIVE_INTERFACE_REACTIVE_MODE, "coroutines"); - codegen.additionalProperties().put(USE_RESPONSE_ENTITY, true); - codegen.additionalProperties().put(REQUEST_MAPPING_OPTION, "none"); - codegen.additionalProperties().put(USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); - assertFileContains( - path, - " suspend fun getInventory(\n" - + " ): ResponseEntity>", - " suspend fun deleteOrder(\n" - + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" - + " ): ResponseEntity", - " suspend fun placeOrder(\n" - + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" - + " ): ResponseEntity" + public void generateSerializableModelWithXimplements() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml", Map.of( + CodegenConstants.SERIALIZABLE_MODEL, true + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "false", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/model/Dog.kt"), + List.of("import java.io.Serializable", + "@get:JsonProperty(\"likesFetch\", required = true) override val likesFetch: kotlin.Boolean,", + ") : Pet, Serializable, com.some.pack.Fetchable {", + "private const val serialVersionUID: kotlin.Long = 1") + ) ); } @Test - public void generateHttpInterfaceReactiveWithReactor() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-declarative-http-interface"); - codegen.additionalProperties().put(REACTIVE, true); - codegen.additionalProperties().put(DECLARATIVE_INTERFACE_REACTIVE_MODE, "reactor"); - codegen.additionalProperties().put(USE_RESPONSE_ENTITY, false); - codegen.additionalProperties().put(REQUEST_MAPPING_OPTION, "none"); - codegen.additionalProperties().put(USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); - assertFileContains( - path, - "import reactor.core.publisher.Flux\n" - + "import reactor.core.publisher.Mono", - " fun getInventory(\n" - + " ): Mono>", - " fun deleteOrder(\n" - + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" - + " ): Mono", - " fun placeOrder(\n" - + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" - + " ): Mono" - ); - assertFileNotContains( - path, - "suspend" + public void generateHttpInterfaceReactiveWithReactorResponseEntity() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + CodegenConstants.LIBRARY, "spring-declarative-http-interface", + REACTIVE, true, + DECLARATIVE_INTERFACE_REACTIVE_MODE, "reactor", + USE_RESPONSE_ENTITY, true, + REQUEST_MAPPING_OPTION, "none", + USE_FLOW_FOR_ARRAY_RETURN_TYPE, false + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + Path storeApiClient = apiSources.resolve("src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); + assertGeneratedFilesContain( + Map.of( + storeApiClient, + List.of( + "import reactor.core.publisher.Flux\n" + + "import reactor.core.publisher.Mono", + " @HttpExchange(\n" + + " url = PATH_GET_INVENTORY /* \"/store/inventory\" */,\n" + + " method = \"GET\"\n" + + " )\n" + + " fun getInventory(\n" + + " ): Mono>>", + " @HttpExchange(\n" + + " url = PATH_DELETE_ORDER /* \"/store/order/{orderId}\" */,\n" + + " method = \"DELETE\"\n" + + " )\n" + + " fun deleteOrder(\n" + + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" + + " ): Mono>", + " @HttpExchange(\n" + + " url = PATH_PLACE_ORDER /* \"/store/order\" */,\n" + + " method = \"POST\"\n" + + " )\n" + + " fun placeOrder(\n" + + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" + + " ): Mono>", + " companion object {\n" + + " //for your own safety never directly reuse these path definitions in tests\n" + + " const val PATH_DELETE_ORDER: String = \"/store/order/{orderId}\"\n" + + " const val PATH_GET_INVENTORY: String = \"/store/inventory\"\n" + + " const val PATH_GET_ORDER_BY_ID: String = \"/store/order/{orderId}\"\n" + + " const val PATH_PLACE_ORDER: String = \"/store/order\"\n" + + " }") + ) ); + assertGeneratedFilesNotContain( + Map.of(storeApiClient, List.of("suspend"))); } @Test - public void generateHttpInterfaceReactiveWithCoroutines() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-declarative-http-interface"); - codegen.additionalProperties().put(REACTIVE, true); - codegen.additionalProperties().put(DECLARATIVE_INTERFACE_REACTIVE_MODE, "coroutines"); - codegen.additionalProperties().put(USE_RESPONSE_ENTITY, false); - codegen.additionalProperties().put(REQUEST_MAPPING_OPTION, "none"); - codegen.additionalProperties().put(USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); - assertFileContains( - path, - " suspend fun getInventory(\n" - + " ): Map", - " suspend fun deleteOrder(\n" - + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" - + " ): Unit", - " suspend fun placeOrder(\n" - + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" - + " ): Order" + public void generateHttpInterfaceReactiveWithCoroutinesResponseEntity() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + CodegenConstants.LIBRARY, "spring-declarative-http-interface", + REACTIVE, true, + DECLARATIVE_INTERFACE_REACTIVE_MODE, "coroutines", + USE_RESPONSE_ENTITY, true, + REQUEST_MAPPING_OPTION, "none", + USE_FLOW_FOR_ARRAY_RETURN_TYPE, false + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/StoreApiClient.kt"), + List.of(" suspend fun getInventory(\n" + + " ): ResponseEntity>", + " suspend fun deleteOrder(\n" + + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" + + " ): ResponseEntity", + " suspend fun placeOrder(\n" + + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" + + " ): ResponseEntity") + ) ); } @Test - public void generateHttpInterfaceResponseEntity() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-declarative-http-interface"); - codegen.additionalProperties().put(REACTIVE, false); - codegen.additionalProperties().put(USE_RESPONSE_ENTITY, true); - codegen.additionalProperties().put(REQUEST_MAPPING_OPTION, "none"); - codegen.additionalProperties().put(USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); - assertFileContains( - path, - " fun getInventory(\n" - + " ): ResponseEntity>", - " fun deleteOrder(\n" - + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" - + " ): ResponseEntity", - " fun placeOrder(\n" - + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" - + " ): ResponseEntity" - ); - assertFileNotContains( - path, - "suspend" + public void generateHttpInterfaceReactiveWithReactor() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + CodegenConstants.LIBRARY, "spring-declarative-http-interface", + REACTIVE, true, + DECLARATIVE_INTERFACE_REACTIVE_MODE, "reactor", + USE_RESPONSE_ENTITY, false, + REQUEST_MAPPING_OPTION, "none", + USE_FLOW_FOR_ARRAY_RETURN_TYPE, false + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + Path storeApiClient = apiSources.resolve("src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); + assertGeneratedFilesContain( + Map.of( + storeApiClient, + List.of("import reactor.core.publisher.Flux\n" + + "import reactor.core.publisher.Mono", + " fun getInventory(\n" + + " ): Mono>", + " fun deleteOrder(\n" + + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" + + " ): Mono", + " fun placeOrder(\n" + + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" + + " ): Mono") + ) ); + assertGeneratedFilesNotContain( + Map.of(storeApiClient, List.of("suspend"))); } @Test - public void generateHttpInterface() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(CodegenConstants.LIBRARY, "spring-declarative-http-interface"); - codegen.additionalProperties().put(REACTIVE, false); - codegen.additionalProperties().put(USE_RESPONSE_ENTITY, false); - codegen.additionalProperties().put(REQUEST_MAPPING_OPTION, "api_interface"); - codegen.additionalProperties().put(USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); - assertFileContains( - path, - "@HttpExchange(\n" - + "\"\\${openapi.openAPIPetstore.base-path:\\${api.base-path:$BASE_PATH}}\"\n" - + ")", - " fun getInventory(\n" - + " ): Map", - " fun deleteOrder(\n" - + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" - + " ): Unit", - " fun placeOrder(\n" - + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" - + " ): Order" - ); - assertFileNotContains( - path, - "suspend" + public void generateHttpInterfaceReactiveWithCoroutines() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + CodegenConstants.LIBRARY, "spring-declarative-http-interface", + REACTIVE, true, + DECLARATIVE_INTERFACE_REACTIVE_MODE, "coroutines", + USE_RESPONSE_ENTITY, false, + REQUEST_MAPPING_OPTION, "api_interface", + USE_FLOW_FOR_ARRAY_RETURN_TYPE, false + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( + Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/StoreApiClient.kt"), + List.of("@HttpExchange(\n" + + "\"\\${openapi.openAPIPetstore.base-path:\\${api.base-path:$BASE_PATH}}\"\n" + + ")", + " suspend fun getInventory(\n" + + " ): Map", + " suspend fun deleteOrder(\n" + + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" + + " ): Unit", + " suspend fun placeOrder(\n" + + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" + + " ): Order") + ) ); } @Test - public void generateNonSerializableModelWithXimplements() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - output.deleteOnExit(); - String outputPath = output.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml")) - .config(codegen); - DefaultGenerator generator = new DefaultGenerator(); - - generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false"); - generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false"); - - generator.opts(input).generate(); - - Path path = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Dog.kt"); - assertFileContains( - path, - "@get:JsonProperty(\"likesFetch\", required = true) override val likesFetch: kotlin.Boolean,", - ") : Pet, com.some.pack.Fetchable {" - ); - assertFileNotContains( - path, - "import java.io.Serializable", - ") : Pet, Serializable, com.some.pack.Fetchable {", - ") : Pet, Serializable {", - "private const val serialVersionUID: kotlin.Long = 1" + public void generateHttpInterfaceResponseEntity() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + CodegenConstants.LIBRARY, "spring-declarative-http-interface", + REACTIVE, false, + USE_RESPONSE_ENTITY, true, + REQUEST_MAPPING_OPTION, "none", + USE_FLOW_FOR_ARRAY_RETURN_TYPE, false + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + Path storeApiClient = apiSources.resolve("src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); + assertGeneratedFilesContain( + Map.of( + storeApiClient, + List.of(" fun getInventory(\n" + + " ): ResponseEntity>", + " fun deleteOrder(\n" + + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" + + " ): ResponseEntity", + " fun placeOrder(\n" + + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" + + " ): ResponseEntity") + ) ); + assertGeneratedFilesNotContain(Map.of(storeApiClient, List.of("suspend"))); } - private Path generateApiSources( - Map additionalProperties, - Map generatorPropertyDefaults - ) throws Exception { - File outputDir = Files.createTempDirectory("test").toFile().getCanonicalFile(); - outputDir.deleteOnExit(); - String outputPath = outputDir.getAbsolutePath().replace('\\', '/'); - - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(outputDir.getAbsolutePath()); - codegen.additionalProperties().putAll(additionalProperties); - - ClientOptInput input = new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/petstore.yaml")) - .config(codegen); - - DefaultGenerator generator = new DefaultGenerator(); - for (var entry : generatorPropertyDefaults.entrySet()) { - generator.setGeneratorPropertyDefault(entry.getKey(), entry.getValue()); - } - generator.opts(input).generate(); - - return Paths.get(outputPath); - } - - private void verifyGeneratedFilesContain(Map> expectedSnippetsByPathsToFiles) { - for (var expectedSnippetsByPathToFile : expectedSnippetsByPathsToFiles.entrySet()) { - assertFileContains(expectedSnippetsByPathToFile.getKey(), expectedSnippetsByPathToFile.getValue().toArray(new String[0])); - } + @Test + public void generateHttpInterface() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( + CodegenConstants.LIBRARY, "spring-declarative-http-interface", + REACTIVE, false, + USE_RESPONSE_ENTITY, false, + REQUEST_MAPPING_OPTION, "none", + USE_FLOW_FOR_ARRAY_RETURN_TYPE, false + ), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + Path storeApiClient = apiSources.resolve("src/main/kotlin/org/openapitools/api/StoreApiClient.kt"); + assertGeneratedFilesContain( + Map.of( + storeApiClient, List.of( + " fun getInventory(\n" + + " ): Map", + " fun deleteOrder(\n" + + " @Parameter(description = \"ID of the order that needs to be deleted\", required = true) @PathVariable(\"orderId\") orderId: kotlin.String\n" + + " ): Unit", + " fun placeOrder(\n" + + " @Parameter(description = \"order placed for purchasing the pet\", required = true) @Valid @RequestBody order: Order\n" + + " ): Order") + ) + ); + assertGeneratedFilesNotContain(Map.of(storeApiClient, List.of("suspend"))); } - private void verifyGeneratedFilesNotContain(Map> unexpectedSnippetsByPathsToFiles) { - for (var unexpectedSnippetsByPathToFile : unexpectedSnippetsByPathsToFiles.entrySet()) { - assertFileNotContains(unexpectedSnippetsByPathToFile.getKey(), unexpectedSnippetsByPathToFile.getValue().toArray(new String[0])); - } + @Test + public void generateNonSerializableModelWithXimplements() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml", Map.of(), Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "false", + CodegenConstants.SUPPORTING_FILES, "false" + )); + Path dogDto = apiSources.resolve("src/main/kotlin/org/openapitools/model/Dog.kt"); + assertGeneratedFilesContain( + Map.of( + dogDto, List.of( + "@get:JsonProperty(\"likesFetch\", required = true) override val likesFetch: kotlin.Boolean,", + ") : Pet, com.some.pack.Fetchable {") + ) + ); + assertGeneratedFilesNotContain( + Map.of( + dogDto, List.of( + "import java.io.Serializable", + ") : Pet, Serializable, com.some.pack.Fetchable {", + ") : Pet, Serializable {", + "private const val serialVersionUID: kotlin.Long = 1") + ) + ); } @Test - public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1420,9 +988,9 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDeleg CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1432,15 +1000,15 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDeleg + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(@Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange)") ) ); } @Test - public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1454,9 +1022,9 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoDele CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1466,15 +1034,15 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoDele + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(@ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange") ) ); } @Test - public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1488,9 +1056,9 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1500,15 +1068,15 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate + " @PathVariable(\"petId\") petId: kotlin.Long," + " exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1522,9 +1090,9 @@ public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDeleg CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -1532,15 +1100,15 @@ public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDeleg "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1554,9 +1122,9 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDe CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1566,15 +1134,15 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerNoDe + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(@Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1588,9 +1156,9 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoD CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1600,15 +1168,15 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1NoD + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1622,9 +1190,9 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDeleg CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1634,15 +1202,15 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDeleg + " @PathVariable(\"petId\") petId: kotlin.Long," + " request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1656,9 +1224,9 @@ public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDe CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -1666,15 +1234,15 @@ public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneNoDe "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1688,9 +1256,9 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDelega CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1700,15 +1268,15 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDelega + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1722,9 +1290,9 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDeleg CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1734,15 +1302,15 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDeleg + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1756,9 +1324,9 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate( CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1768,15 +1336,15 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate( + " @PathVariable(\"petId\") petId: kotlin.Long," + " exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1790,9 +1358,9 @@ public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDelega CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -1800,15 +1368,15 @@ public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDelega "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1822,9 +1390,9 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDel CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1834,15 +1402,15 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerNoDel + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1856,9 +1424,9 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDe CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1868,15 +1436,15 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1NoDe + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1890,9 +1458,9 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelega CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1902,15 +1470,15 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneNoDelega + " @PathVariable(\"petId\") petId: kotlin.Long," + " request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegateWithApiTests() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegateWithApiTests() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1925,9 +1493,9 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDeleg CodegenConstants.API_TESTS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1937,12 +1505,12 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDeleg + " @PathVariable(\"petId\") petId: kotlin.Long," + " request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/test/kotlin/org/openapitools/api/PetApiTest.kt"), List.of( + apiSources.resolve("src/test/kotlin/org/openapitools/api/PetApiTest.kt"), List.of( "val request: javax.servlet.http.HttpServletRequest = TODO()", "api.deletePet(petId, apiKey, request)"), - root.resolve("src/test/kotlin/org/openapitools/api/UserApiTest.kt"), List.of( + apiSources.resolve("src/test/kotlin/org/openapitools/api/UserApiTest.kt"), List.of( "val request: javax.servlet.http.HttpServletRequest = TODO()", "api.logoutUser(request)") ) @@ -1950,8 +1518,8 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneNoDeleg } @Test - public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegateWithApiTests() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegateWithApiTests() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -1966,9 +1534,9 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate CodegenConstants.API_TESTS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -1978,12 +1546,12 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate + " @PathVariable(\"petId\") petId: kotlin.Long," + " exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( "logoutUser(exchange: org.springframework.web.server.ServerWebExchange)"), - root.resolve("src/test/kotlin/org/openapitools/api/PetApiTest.kt"), List.of( + apiSources.resolve("src/test/kotlin/org/openapitools/api/PetApiTest.kt"), List.of( "val exchange: org.springframework.web.server.ServerWebExchange = TODO()", "api.deletePet(petId, apiKey, exchange)"), - root.resolve("src/test/kotlin/org/openapitools/api/UserApiTest.kt"), List.of( + apiSources.resolve("src/test/kotlin/org/openapitools/api/UserApiTest.kt"), List.of( "val exchange: org.springframework.web.server.ServerWebExchange = TODO()", "api.logoutUser(exchange)") ) @@ -1991,8 +1559,8 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationNoneNoDelegate } @Test - public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2006,9 +1574,9 @@ public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDel CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -2016,15 +1584,15 @@ public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneNoDel "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2038,9 +1606,9 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerDelegat CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2050,20 +1618,20 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwaggerDelegat + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity", "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1Delegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1Delegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2077,9 +1645,9 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1Delega CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2089,20 +1657,20 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationSwagger1Delega + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity", "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextControllerImplAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextControllerImplAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2116,9 +1684,9 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationNoneDelegate() CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2128,20 +1696,20 @@ public void reactiveWithHttpRequestContextControllerImplAnnotationNoneDelegate() + " @PathVariable(\"petId\") petId: kotlin.Long," + " exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity", "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2155,9 +1723,9 @@ public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneDelegat CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -2165,20 +1733,20 @@ public void reactiveWithoutHttpRequestContextControllerImplAnnotationNoneDelegat "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "apiKey: kotlin.String?): ResponseEntity", "petId: kotlin.Long): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "(): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2192,9 +1760,9 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerDele CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2204,20 +1772,20 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwaggerDele + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity", "request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1Delegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1Delegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2231,9 +1799,9 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1Del CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2243,20 +1811,20 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationSwagger1Del + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity", "request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2270,9 +1838,9 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneDelegat CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "fun deletePet(\n" + " @PathVariable(\"petId\") petId: kotlin.Long,\n" + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?,\n" @@ -2282,20 +1850,20 @@ public void nonReactiveWithHttpRequestContextControllerImplAnnotationNoneDelegat + " @PathVariable(\"petId\") petId: kotlin.Long,\n" + " request: javax.servlet.http.HttpServletRequest\n" + " ): ResponseEntity {"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity", "request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2309,9 +1877,9 @@ public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneDele CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -2319,20 +1887,20 @@ public void nonReactiveWithoutHttpRequestContextControllerImplAnnotationNoneDele "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "apiKey: kotlin.String?): ResponseEntity", "petId: kotlin.Long): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "(): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2346,9 +1914,9 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDelegate CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2358,20 +1926,20 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDelegate + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@Parameter(hidden = true) exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity", "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Delegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Delegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2385,9 +1953,9 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Delegat CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2397,20 +1965,20 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Delegat + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity", "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2424,9 +1992,9 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2436,20 +2004,20 @@ public void reactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() + " @PathVariable(\"petId\") petId: kotlin.Long," + " exchange: org.springframework.web.server.ServerWebExchange" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity", "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity") ) ); } @Test - public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, true, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2463,9 +2031,9 @@ public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDelegate CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -2473,20 +2041,20 @@ public void reactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDelegate "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "apiKey: kotlin.String?): ResponseEntity", "petId: kotlin.Long): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "(): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2500,9 +2068,9 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDeleg CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @Parameter(description = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(description = \"\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2512,20 +2080,20 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwaggerDeleg + " @Parameter(description = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@Parameter(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity", "request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Delegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Delegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2539,9 +2107,9 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Dele CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @ApiParam(value = \"Pet id to delete\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(value = \"\") @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2551,20 +2119,20 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationSwagger1Dele + " @ApiParam(value = \"ID of pet to return\", required = true) @PathVariable(\"petId\") petId: kotlin.Long," + " @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity", "request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, true, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2578,9 +2146,9 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?," @@ -2590,20 +2158,20 @@ public void nonReactiveWithHttpRequestContextInterfaceOnlyAnnotationNoneDelegate + " @PathVariable(\"petId\") petId: kotlin.Long," + " request: javax.servlet.http.HttpServletRequest" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity", "request: javax.servlet.http.HttpServletRequest): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "request: javax.servlet.http.HttpServletRequest): ResponseEntity") ) ); } @Test - public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() throws Exception { - Path root = generateApiSources(Map.of( + public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDelegate() { + Path apiSources = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.INCLUDE_HTTP_REQUEST_CONTEXT, false, KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", @@ -2617,9 +2185,9 @@ public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDeleg CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( - root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "deletePet(" + " @PathVariable(\"petId\") petId: kotlin.Long," + " @RequestHeader(value = \"api_key\", required = false) apiKey: kotlin.String?" @@ -2627,12 +2195,12 @@ public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDeleg "getPetById(" + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( "logoutUser(): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiDelegate.kt"), List.of( "apiKey: kotlin.String?): ResponseEntity", "petId: kotlin.Long): ResponseEntity"), - root.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiDelegate.kt"), List.of( "(): ResponseEntity") ) ); @@ -2640,20 +2208,21 @@ public void nonReactiveWithoutHttpRequestContextInterfaceOnlyAnnotationNoneDeleg @Test public void reactiveWithoutResponseEntity() throws Exception { - Path root = generateApiSources(Map.of( - KotlinSpringServerCodegen.REACTIVE, true, - KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", - KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "none", - KotlinSpringServerCodegen.INTERFACE_ONLY, true, - KotlinSpringServerCodegen.USE_RESPONSE_ENTITY, false - ), Map.of( - CodegenConstants.MODELS, "false", - CodegenConstants.MODEL_TESTS, "false", - CodegenConstants.MODEL_DOCS, "false", - CodegenConstants.APIS, "true", - CodegenConstants.SUPPORTING_FILES, "false" - )); - verifyGeneratedFilesContain( + Path root = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, true, + KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", + KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "none", + KotlinSpringServerCodegen.INTERFACE_ONLY, true, + KotlinSpringServerCodegen.USE_RESPONSE_ENTITY, false + ), Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( Map.of( root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "@ResponseStatus(HttpStatus.BAD_REQUEST)", @@ -2678,20 +2247,21 @@ public void reactiveWithoutResponseEntity() throws Exception { @Test public void nonReactiveWithoutResponseEntity() throws Exception { - Path root = generateApiSources(Map.of( - KotlinSpringServerCodegen.REACTIVE, false, - KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", - KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "none", - KotlinSpringServerCodegen.INTERFACE_ONLY, true, - KotlinSpringServerCodegen.USE_RESPONSE_ENTITY, false - ), Map.of( - CodegenConstants.MODELS, "false", - CodegenConstants.MODEL_TESTS, "false", - CodegenConstants.MODEL_DOCS, "false", - CodegenConstants.APIS, "true", - CodegenConstants.SUPPORTING_FILES, "false" - )); - verifyGeneratedFilesContain( + Path root = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, false, + KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", + KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "none", + KotlinSpringServerCodegen.INTERFACE_ONLY, true, + KotlinSpringServerCodegen.USE_RESPONSE_ENTITY, false + ), Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( Map.of( root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "@ResponseStatus(HttpStatus.BAD_REQUEST)", @@ -2713,7 +2283,7 @@ public void nonReactiveWithoutResponseEntity() throws Exception { ) ); - verifyGeneratedFilesNotContain( + assertGeneratedFilesNotContain( Map.of( root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of("suspend"), root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of("suspend"), @@ -2724,20 +2294,22 @@ public void nonReactiveWithoutResponseEntity() throws Exception { @Test public void reactiveWithResponseEntity() throws Exception { - Path root = generateApiSources(Map.of( - KotlinSpringServerCodegen.REACTIVE, true, - KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", - KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "none", - KotlinSpringServerCodegen.INTERFACE_ONLY, true, - KotlinSpringServerCodegen.USE_RESPONSE_ENTITY, true - ), Map.of( - CodegenConstants.MODELS, "false", - CodegenConstants.MODEL_TESTS, "false", - CodegenConstants.MODEL_DOCS, "false", - CodegenConstants.APIS, "true", - CodegenConstants.SUPPORTING_FILES, "false" - )); - verifyGeneratedFilesContain( + Path root = generateApiSources( + "src/test/resources/3_0/kotlin/petstore.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, true, + KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", + KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "none", + KotlinSpringServerCodegen.INTERFACE_ONLY, true, + KotlinSpringServerCodegen.USE_RESPONSE_ENTITY, true + ), Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + )); + assertGeneratedFilesContain( Map.of( root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "suspend fun deletePet(" @@ -2755,7 +2327,7 @@ public void reactiveWithResponseEntity() throws Exception { ) ); - verifyGeneratedFilesNotContain( + assertGeneratedFilesNotContain( Map.of( root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of("@ResponseStatus(HttpStatus."), root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of("@ResponseStatus(HttpStatus."), @@ -2766,7 +2338,7 @@ public void reactiveWithResponseEntity() throws Exception { @Test public void nonReactiveWithResponseEntity() throws Exception { - Path root = generateApiSources(Map.of( + Path root = generateApiSources("src/test/resources/3_0/kotlin/petstore.yaml", Map.of( KotlinSpringServerCodegen.REACTIVE, false, KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "none", KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "none", @@ -2779,7 +2351,7 @@ public void nonReactiveWithResponseEntity() throws Exception { CodegenConstants.APIS, "true", CodegenConstants.SUPPORTING_FILES, "false" )); - verifyGeneratedFilesContain( + assertGeneratedFilesContain( Map.of( root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of( "fun deletePet(" @@ -2790,14 +2362,14 @@ public void nonReactiveWithResponseEntity() throws Exception { + " @PathVariable(\"petId\") petId: kotlin.Long" + " ): ResponseEntity"), root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( - "fun logoutUser(): ResponseEntity" + "fun logoutUser(): ResponseEntity" ), root.resolve("src/main/kotlin/org/openapitools/api/StoreApi.kt"), List.of( "fun getInventory(): ResponseEntity>") ) ); - verifyGeneratedFilesNotContain( + assertGeneratedFilesNotContain( Map.of( root.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of("suspend", "@ResponseStatus(HttpStatus."), root.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of("suspend", "@ResponseStatus(HttpStatus."), @@ -2807,283 +2379,433 @@ public void nonReactiveWithResponseEntity() throws Exception { } @Test - public void reactiveWithoutFlow() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.REACTIVE, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml")) - .config(codegen) + public void reactiveWithoutFlow() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, true, + KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, false, + KotlinSpringServerCodegen.USE_TAGS, true, + KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true, + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiService.kt") ); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "Flow"); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("List") + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("Flow") + )); } @Test - public void reactiveWithFlow() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.REACTIVE, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml")) - .config(codegen) + public void reactiveWithFlow() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, true, + KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, true, + KotlinSpringServerCodegen.USE_TAGS, true, + KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true, + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiService.kt") ); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - "List"); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "List"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "Flow"); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "List"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "Flow"); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "List"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "Flow"); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("Flow") + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("List") + )); } @Test - public void reactiveWithDefaultValueFlow() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.REACTIVE, true); - // should use default 'true' instead - // codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml")) - .config(codegen) + public void reactiveWithDefaultValueFlow() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, true, + KotlinSpringServerCodegen.USE_TAGS, true, + KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true, + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiService.kt") ); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - "List"); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "List"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "Flow"); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "List"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "Flow"); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "List"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "Flow"); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("Flow") + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("List") + )); } @Test - public void nonReactiveWithoutFlow() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.REACTIVE, false); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, false); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml")) - .config(codegen) + public void nonReactiveWithoutFlow() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, false, + KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, false, + KotlinSpringServerCodegen.USE_TAGS, true, + KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true, + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiService.kt") ); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "Flow"); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("List") + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("Flow") + )); } @Test - public void nonReactiveWithFlow() throws Exception { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.REACTIVE, false); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_TAGS, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); - - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml")) - .config(codegen) + public void nonReactiveWithFlow() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/issue16130-add-useFlowForArrayReturnType-param.yaml", + Map.of( + KotlinSpringServerCodegen.REACTIVE, false, + KotlinSpringServerCodegen.USE_FLOW_FOR_ARRAY_RETURN_TYPE, true, + KotlinSpringServerCodegen.USE_TAGS, true, + KotlinSpringServerCodegen.SERVICE_IMPLEMENTATION, true, + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" ) - .generate(); - - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/TestV1ApiService.kt") ); - - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1Api.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), - "Flow"); - - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "List"); - assertFileNotContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), - "Flow"); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("List"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("List") + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiController.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1Api.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiDelegate.kt"), List.of("Flow"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/TestV1ApiService.kt"), List.of("Flow") + )); } @Test - public void testValidationsInQueryParams_issue21238_Controller() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); - KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue21238_queryParam_validation.yaml")) - .config(codegen) + public void testValidationsInQueryParams_issue21238_Controller() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/issue21238_queryParam_validation.yaml", + Map.of(), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" ) - .generate(); + ); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApiController.kt"), List.of("@NotNull", "@Valid"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApiController.kt"), List.of( + "@NotNull", + "@Valid", + "@Pattern(regexp=\"^[a-zA-Z0-9]+[a-zA-Z0-9\\\\.\\\\-_]*[a-zA-Z0-9]+$\")", + "@Parameter(description = \"The user name for login\", required = true)", + "@Parameter(description = \"The password for login in clear text\", required = true)" + ) + )); + } - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/PetApiController.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/UserApiController.kt") + @Test + public void testValidationsInQueryParams_issue21238_Api_Delegate() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/issue21238_queryParam_validation.yaml", + Map.of(KotlinSpringServerCodegen.DELEGATE_PATTERN, true), + Map.of( + CodegenConstants.MODELS, "false", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + ) ); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/PetApi.kt"), List.of("@NotNull", "@Valid"), + apiSources.resolve("src/main/kotlin/org/openapitools/api/UserApi.kt"), List.of( + "@NotNull", + "@Valid", + "@Pattern(regexp=\"^[a-zA-Z0-9]+[a-zA-Z0-9\\\\.\\\\-_]*[a-zA-Z0-9]+$\")" + ) + )); + } - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApiController.kt"), - "@NotNull", "@Valid"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/UserApiController.kt"), - "@NotNull", "@Valid", - "@Pattern(regexp=\"^[a-zA-Z0-9]+[a-zA-Z0-9\\\\.\\\\-_]*[a-zA-Z0-9]+$\")", - "@Parameter(description = \"The user name for login\", required = true)", - "@Parameter(description = \"The password for login in clear text\", required = true)"); + @Test + public void testDollarsAndQuotesSwagger1() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/petstore-with-tags.yaml", + Map.of( + KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "springfox", + KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "swagger1", + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + ) + ); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/ItemsApi.kt"), + List.of("value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "@PathVariable(\"item\\$Id\")", + "@PathVariable(\"item\\$SubId\")", + "@RequestParam(value = \"filter\\$Type\"", + "@RequestParam(value = \"filter\\$SubType\"", + "@CookieValue(name = \"session\\$Token\"", + "@CookieValue(name = \"session\\$TokenTwo\"", + "@RequestParam(value = \"form\\$Name\"", + "@RequestParam(value = \"form\\$Value\"", + "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item\\$Id}/something/{item\\$SubId}\"", + "/* \"/items/{item$Id}/something/{item$SubId}\" */" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), + List.of( + "@ApiModelProperty(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", + "@get:JsonProperty(\"item\\$Id\") val itemDollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "@get:JsonProperty(\"name\\$Value\") val nameDollarValue: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "@get:JsonProperty(\"details\\$Info\")", + "@param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + "@param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), + List.of( + "@ApiModelProperty(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", value = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", + "@get:JsonProperty(\"\\$id\") val dollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "@get:JsonProperty(\"\\$name\") val dollarName: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "* SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + "* @param dollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + "* @param dollarName SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + ) + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/ItemsApi.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "@PathVariable(\"item$Id\")", + "@PathVariable(\"item$SubId\")", + "@RequestParam(value = \"filter$Type\"", + "@RequestParam(value = \"filter$SubType\"", + "@CookieValue(name = \"session$Token\"", + "@CookieValue(name = \"session$TokenTwo\"", + "@RequestParam(value = \"form$Name\"", + "@RequestParam(value = \"form$Value\"", + "PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = \"/items/{item$Id}/something/{item$SubId}\"", + "/* \"/items/{item\\$Id}/something/{item\\$SubId}\" */" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "item$Id", + "name$Value", + "details$Info" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "\"$id\"", + "\"$name\"" + ) + )); } @Test - public void testValidationsInQueryParams_issue21238_Api_Delegate() throws IOException { - File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + public void testDollarsAndQuotesSwagger2() { + Path apiSources = generateApiSources( + "src/test/resources/3_0/kotlin/petstore-with-tags.yaml", + Map.of( + KotlinSpringServerCodegen.DOCUMENTATION_PROVIDER, "springdoc", + KotlinSpringServerCodegen.ANNOTATION_LIBRARY, "swagger2", + KotlinSpringServerCodegen.DELEGATE_PATTERN, true + ), + Map.of( + CodegenConstants.MODELS, "true", + CodegenConstants.MODEL_TESTS, "false", + CodegenConstants.MODEL_DOCS, "false", + CodegenConstants.APIS, "true", + CodegenConstants.SUPPORTING_FILES, "false" + ) + ); + assertGeneratedFilesContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/ItemsApi.kt"), + List.of( + "summary = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"", + "description = \"\"\"SQ = \"; SBS = \\; DBS = \\\\; SD = ${'$'}some\"\"\"", + "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", required = true) @PathVariable(\"item\\$Id\") itemDollarId: kotlin.String", + "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", required = true) @PathVariable(\"item\\$SubId\") itemDollarSubId: kotlin.String", + "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", schema = Schema(defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")) @Valid @RequestParam(value = \"filter\\$Type\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\") filterDollarType: kotlin.String", + "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", schema = Schema(defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")) @Valid @RequestParam(value = \"filter\\$SubType\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\") filterDollarSubType: kotlin.String", + "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"X-Custom_Header\", required = false) xCustomHeader: kotlin.String?", + "@Parameter(description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", `in` = ParameterIn.HEADER) @RequestHeader(value = \"X-Custom_Header_two\", required = false) xCustomHeaderTwo: kotlin.String?", + "@CookieValue(name = \"session\\$Token\", required = false) sessionDollarToken: kotlin.String?", + "@CookieValue(name = \"session\\$TokenTwo\", required = false) sessionDollarTokenTwo: kotlin.String?" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), + List.of( + "* @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + "* @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some", + "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", + "@get:JsonProperty(\"item\\$Id\") val itemDollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", + "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", + "@get:JsonProperty(\"name\\$Value\") val nameDollarValue: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", + "@get:JsonProperty(\"details\\$Info\")" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), + List.of( + "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", + "@get:JsonProperty(\"\\$id\") val dollarId: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\",", + "@Schema(example = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\", description = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\")", + "@get:JsonProperty(\"\\$name\") val dollarName: kotlin.String? = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = \\$some\"" + ) + )); + assertGeneratedFilesNotContain(Map.of( + apiSources.resolve("src/main/kotlin/org/openapitools/api/ItemsApi.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "@PathVariable(\"item$Id\") itemDollarId: kotlin.String", + "@PathVariable(\"item$SubId\") itemDollarSubId: kotlin.String", + "@RequestParam(value = \"filter$Type\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some\") filterDollarType: kotlin.String", + "@RequestParam(value = \"filter$SubType\", required = false, defaultValue = \"SQ = \\\"; SBS = \\\\; DBS = \\\\\\\\; SD = $some\") filterDollarSubType: kotlin.String", + "@CookieValue(name = \"session$Token\"", + "@CookieValue(name = \"session$TokenTwo\"" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some", + "* @param itemDollarId SQ = \"; SBS = \\; DBS = \\\\; SD = \\$some", + "* @param nameDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = \\$some" + ), + apiSources.resolve("src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt"), + List.of( + "SQ = \\\\\";", + "SBS = \\\\\\\\;", + "DBS = \\\\\\\\\\\\\\\\;", + "SD = \\\\$some" + ) + )); + } + + private Path generateApiSources( + String specFilePath, + Map additionalProperties, + Map generatorPropertyDefaults + ) { + File outputDir; + try { + outputDir = Files.createTempDirectory("test").toFile().getCanonicalFile(); + } catch (IOException e) { + throw new RuntimeException(e); + } + outputDir.deleteOnExit(); + String outputPath = outputDir.getAbsolutePath().replace('\\', '/'); + KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen(); - codegen.setOutputDir(output.getAbsolutePath()); - codegen.additionalProperties().put(KotlinSpringServerCodegen.DELEGATE_PATTERN, true); + codegen.setOutputDir(outputDir.getAbsolutePath()); + codegen.additionalProperties().putAll(additionalProperties); - List files = new DefaultGenerator() - .opts( - new ClientOptInput() - .openAPI(TestUtils.parseSpec("src/test/resources/3_0/kotlin/issue21238_queryParam_validation.yaml")) - .config(codegen) - ) - .generate(); + ClientOptInput input = new ClientOptInput() + .openAPI(TestUtils.parseSpec(specFilePath)) + .config(codegen); - Assertions.assertThat(files).contains( - new File(output, "src/main/kotlin/org/openapitools/api/PetApi.kt"), - new File(output, "src/main/kotlin/org/openapitools/api/UserApi.kt") - ); + DefaultGenerator generator = new DefaultGenerator(); + for (var entry : generatorPropertyDefaults.entrySet()) { + generator.setGeneratorPropertyDefault(entry.getKey(), entry.getValue()); + } + generator.opts(input).generate(); + + return Paths.get(outputPath); + } + + private static void assertGeneratedFilesContain(Map> expectedSnippetsByPathsToFiles) { + for (var expectedSnippetsByPathToFile : expectedSnippetsByPathsToFiles.entrySet()) { + assertFileContains(expectedSnippetsByPathToFile.getKey(), expectedSnippetsByPathToFile.getValue().toArray(new String[0])); + } + } + + private static void assertGeneratedFilesNotContain(Map> unexpectedSnippetsByPathsToFiles) { + for (var unexpectedSnippetsByPathToFile : unexpectedSnippetsByPathsToFiles.entrySet()) { + assertFileNotContains(unexpectedSnippetsByPathToFile.getKey(), unexpectedSnippetsByPathToFile.getValue().toArray(new String[0])); + } + } - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/PetApi.kt"), - "@NotNull", "@Valid"); - assertFileContains(Paths.get(output + "/src/main/kotlin/org/openapitools/api/UserApi.kt"), - "@NotNull", "@Valid", "@Pattern(regexp=\"^[a-zA-Z0-9]+[a-zA-Z0-9\\\\.\\\\-_]*[a-zA-Z0-9]+$\")"); + private static void assertGeneratedFilesExist(List files) { + for (Path file : files) { + Assertions.assertThat(Files.exists(file)) + .withFailMessage("Expected file %s to exist but was not found", file.toAbsolutePath()) + .isTrue(); + } } @DataProvider diff --git a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml index 062ab023e2d0..2e0b13e4c2d2 100644 --- a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-tags.yaml @@ -271,12 +271,11 @@ paths: additionalMetadata: type: string description: Additional data to pass to server - required: false image: type: string description: image to upload format: binary - required: true + required: [ image ] responses: 200: description: successful operation @@ -310,14 +309,13 @@ paths: additionalMetadata: type: string description: Additional data to pass to server - required: false images: type: array items: type: string description: image to upload format: binary - required: true + required: [ images ] responses: 200: description: successful operation @@ -654,6 +652,136 @@ paths: 404: description: User not found content: { } + /items/{item$Id}/something/{item$SubId}: + get: + summary: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + parameters: + - name: "item$Id" + in: path + required: true + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "item$SubId" + in: path + required: true + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + - name: "filter$Type" + in: query + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + "default": "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "filter$SubType" + in: query + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + "default": 'SQ = "; SBS = \; DBS = \\; SD = $some' + - name: "X-Custom_Header" + in: header + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "X-Custom_Header_two" + in: header + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + - name: "session$Token" + in: cookie + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "session$TokenTwo" + in: cookie + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + responses: + '200': + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + content: + application/json: + schema: + type: object + properties: + item$Id: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + name$Value: + type: string + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + default: 'SQ = "; SBS = \; DBS = \\; SD = $some' + details$Info: + type: object + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + properties: + detail$One: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + detail$Two: + type: integer + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: 42 + /items: + post: + summary: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + requestBody: + required: true + content: + application/x-www-form-urlencoded: + schema: + type: object + properties: + form$Name: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + form$Value: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + parameters: + - name: "X-Post_Header" + in: header + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + + responses: + "201": + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + content: + application/json: + schema: + $ref: "#/components/schemas/ItemWithDollarAttributesAndExamples" components: schemas: Order: @@ -786,6 +914,20 @@ components: message: type: string description: Describes the result of uploading an image resource + ItemWithDollarAttributesAndExamples: + type: object + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + properties: + $id: + type: string + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + $name: + type: string + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" securitySchemes: petstore_auth: type: oauth2 diff --git a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml index b54ec0cd53ef..6977cdb8dce8 100644 --- a/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/kotlin/petstore-with-x-kotlin-implements.yaml @@ -486,7 +486,136 @@ paths: description: Invalid username supplied '404': description: User not found - + /items/{item$Id}/something/{item$SubId}: + get: + summary: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + parameters: + - name: "item$Id" + in: path + required: true + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "item$SubId" + in: path + required: true + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + - name: "filter$Type" + in: query + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + "default": "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "filter$SubType" + in: query + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + "default": 'SQ = "; SBS = \; DBS = \\; SD = $some' + - name: "X-Custom_Header" + in: header + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "X-Custom_Header_two" + in: header + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + - name: "session$Token" + in: cookie + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "session$TokenTwo" + in: cookie + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + responses: + '200': + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + content: + application/json: + schema: + type: object + properties: + item$Id: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + name$Value: + type: string + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + default: 'SQ = "; SBS = \; DBS = \\; SD = $some' + details$Info: + type: object + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + properties: + detail$One: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + detail$Two: + type: integer + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: 42 + /items: + post: + summary: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + requestBody: + required: true + content: + application/x-www-form-urlencoded: + schema: + type: object + properties: + form$Name: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + form$Value: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + parameters: + - name: "X-Post_Header" + in: header + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + + responses: + "201": + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + content: + application/json: + schema: + $ref: "#/components/schemas/ItemWithDollarAttributesAndExamples" components: securitySchemes: petstore_auth: @@ -644,3 +773,17 @@ components: type: string message: type: string + ItemWithDollarAttributesAndExamples: + type: object + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + properties: + $id: + type: string + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + $name: + type: string + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml b/modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml new file mode 100644 index 000000000000..3aad06ee2656 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/petstore-with-dollars.yaml @@ -0,0 +1,885 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + This is a sample server Petstore server. For this sample, you can use the api key + `special-key` to test the authorization filters. + version: 1.0.0 + title: OpenAPI Petstore + license: + name: Apache-2.0 + url: 'https://www.apache.org/licenses/LICENSE-2.0.html' +tags: + - name: pet + description: Everything about your Pets + - name: store + description: Access to Petstore orders + - name: user + description: Operations about user +paths: + /pet: + post: + tags: + - pet + summary: Add a new pet to the store + description: '' + operationId: addPet + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Pet' + application/json: + schema: + $ref: '#/components/schemas/Pet' + '405': + description: Invalid input + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + requestBody: + $ref: '#/components/requestBodies/Pet' + put: + tags: + - pet + summary: Update an existing pet + description: '' + operationId: updatePet + externalDocs: + url: "http://petstore.swagger.io/v2/doc/updatePet" + description: "API documentation for the updatePet operation" + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Pet' + application/json: + schema: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid ID supplied + '404': + description: Pet not found + '405': + description: Validation exception + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + requestBody: + $ref: '#/components/requestBodies/Pet' + /pet/findByStatus: + get: + tags: + - pet + summary: Finds Pets by status + description: Multiple status values can be provided with comma separated strings + operationId: findPetsByStatus + parameters: + - name: status + in: query + description: Status values that need to be considered for filter + required: true + style: form + explode: false + deprecated: true + schema: + type: array + items: + type: string + enum: + - available + - pending + - sold + default: available + responses: + '200': + description: successful operation + content: + application/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid status value + security: + - petstore_auth: + - 'read:pets' + /pet/findByTags: + get: + tags: + - pet + summary: Finds Pets by tags + description: >- + Multiple tags can be provided with comma separated strings. Use tag1, + tag2, tag3 for testing. + operationId: findPetsByTags + parameters: + - name: tags + in: query + description: Tags to filter by + required: true + style: form + explode: false + schema: + type: array + items: + type: string + responses: + '200': + description: successful operation + content: + application/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid tag value + security: + - petstore_auth: + - 'read:pets' + deprecated: true + '/pet/{petId}': + get: + tags: + - pet + summary: Find pet by ID + description: Returns a single pet + operationId: getPetById + parameters: + - name: petId + in: path + description: ID of pet to return + required: true + schema: + type: integer + format: int64 + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Pet' + application/json: + schema: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid ID supplied + '404': + description: Pet not found + security: + - api_key: [] + post: + tags: + - pet + summary: Updates a pet in the store with form data + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + format: int64 + responses: + '405': + description: Invalid input + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + requestBody: + content: + application/x-www-form-urlencoded: + schema: + type: object + properties: + name: + description: Updated name of the pet + type: string + status: + description: Updated status of the pet + type: string + delete: + tags: + - pet + summary: Deletes a pet + description: '' + operationId: deletePet + parameters: + - name: api_key + in: header + required: false + schema: + type: string + - name: petId + in: path + description: Pet id to delete + required: true + schema: + type: integer + format: int64 + responses: + '400': + description: Invalid pet value + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + '/pet/{petId}/uploadImage': + post: + tags: + - pet + summary: uploads an image + description: '' + operationId: uploadFile + parameters: + - name: petId + in: path + description: ID of pet to update + required: true + schema: + type: integer + format: int64 + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/ApiResponse' + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + file: + description: file to upload + type: string + format: binary + /store/inventory: + get: + tags: + - store + summary: Returns pet inventories by status + description: Returns a map of status codes to quantities + operationId: getInventory + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + additionalProperties: + type: integer + format: int32 + security: + - api_key: [] + /store/order: + post: + tags: + - store + summary: Place an order for a pet + description: '' + operationId: placeOrder + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Order' + application/json: + schema: + $ref: '#/components/schemas/Order' + '400': + description: Invalid Order + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Order' + description: order placed for purchasing the pet + required: true + '/store/order/{orderId}': + get: + tags: + - store + summary: Find purchase order by ID + description: >- + For valid response try integer IDs with value <= 5 or > 10. Other values + will generate exceptions + operationId: getOrderById + parameters: + - name: orderId + in: path + description: ID of pet that needs to be fetched + required: true + schema: + type: integer + format: int64 + minimum: 1 + maximum: 5 + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Order' + application/json: + schema: + $ref: '#/components/schemas/Order' + '400': + description: Invalid ID supplied + '404': + description: Order not found + delete: + tags: + - store + summary: Delete purchase order by ID + description: >- + For valid response try integer IDs with value < 1000. Anything above + 1000 or nonintegers will generate API errors + operationId: deleteOrder + parameters: + - name: orderId + in: path + description: ID of the order that needs to be deleted + required: true + schema: + type: string + responses: + '400': + description: Invalid ID supplied + '404': + description: Order not found + /user: + post: + tags: + - user + summary: Create user + description: This can only be done by the logged in user. + operationId: createUser + responses: + default: + description: successful operation + security: + - api_key: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/User' + description: Created user object + required: true + /user/createWithArray: + post: + tags: + - user + summary: Creates list of users with given input array + description: '' + operationId: createUsersWithArrayInput + responses: + default: + description: successful operation + security: + - api_key: [] + requestBody: + $ref: '#/components/requestBodies/UserArray' + /user/createWithList: + post: + tags: + - user + summary: Creates list of users with given input array + description: '' + operationId: createUsersWithListInput + responses: + default: + description: successful operation + security: + - api_key: [] + requestBody: + $ref: '#/components/requestBodies/UserArray' + /user/login: + get: + tags: + - user + summary: Logs user into the system + description: '' + operationId: loginUser + parameters: + - name: username + in: query + description: The user name for login + required: true + schema: + type: string + pattern: '^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$' + - name: password + in: query + description: The password for login in clear text + required: true + schema: + type: string + responses: + '200': + description: successful operation + headers: + Set-Cookie: + description: >- + Cookie authentication key for use with the `api_key` + apiKey authentication. + schema: + type: string + example: AUTH_KEY=abcde12345; Path=/; HttpOnly + X-Rate-Limit: + description: calls per hour allowed by the user + schema: + type: integer + format: int32 + X-Expires-After: + description: date in UTC when token expires + schema: + type: string + format: date-time + content: + application/xml: + schema: + type: string + application/json: + schema: + type: string + '400': + description: Invalid username/password supplied + /user/logout: + get: + tags: + - user + summary: Logs out current logged in user session + description: '' + operationId: logoutUser + responses: + default: + description: successful operation + security: + - api_key: [] + '/user/{username}': + get: + tags: + - user + summary: Get user by user name + description: '' + operationId: getUserByName + parameters: + - name: username + in: path + description: The name that needs to be fetched. Use user1 for testing. + required: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/User' + application/json: + schema: + $ref: '#/components/schemas/User' + '400': + description: Invalid username supplied + '404': + description: User not found + put: + tags: + - user + summary: Updated user + description: This can only be done by the logged in user. + operationId: updateUser + parameters: + - name: username + in: path + description: name that need to be deleted + required: true + schema: + type: string + responses: + '400': + description: Invalid user supplied + '404': + description: User not found + security: + - api_key: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/User' + description: Updated user object + required: true + delete: + tags: + - user + summary: Delete user + description: This can only be done by the logged in user. + operationId: deleteUser + parameters: + - name: username + in: path + description: The name that needs to be deleted + required: true + schema: + type: string + responses: + '400': + description: Invalid username supplied + '404': + description: User not found + security: + - api_key: [] + /items/{item$Id}/something/{item$SubId}: + get: + summary: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + parameters: + - name: "item$Id" + in: path + required: true + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "item$SubId" + in: path + required: true + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + - name: "filter$Type" + in: query + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + "default": "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "filter$SubType" + in: query + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + "default": 'SQ = "; SBS = \; DBS = \\; SD = $some' + - name: "X-Custom_Header" + in: header + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "X-Custom_Header_two" + in: header + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + - name: "session$Token" + in: cookie + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + - name: "session$TokenTwo" + in: cookie + required: false + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + schema: + type: string + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + responses: + '200': + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + content: + application/json: + schema: + type: object + properties: + item$Id: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + name$Value: + type: string + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: 'SQ = "; SBS = \; DBS = \\; SD = $some' + default: 'SQ = "; SBS = \; DBS = \\; SD = $some' + details$Info: + type: object + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + properties: + detail$One: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + detail$Two: + type: integer + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: 42 + /items: + post: + summary: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + requestBody: + required: true + content: + application/x-www-form-urlencoded: + schema: + type: object + properties: + form$Name: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + form$Value: + type: string + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + parameters: + - name: "X-Post_Header" + in: header + required: false + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + schema: + type: string + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + + responses: + "201": + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + content: + application/json: + schema: + $ref: "#/components/schemas/ItemWithDollarAttributesAndExamples" +externalDocs: + description: Find out more about Swagger + url: 'http://swagger.io' +components: + requestBodies: + UserArray: + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + description: List of user object + required: true + Pet: + content: + application/json: + schema: + $ref: '#/components/schemas/Pet' + application/xml: + schema: + $ref: '#/components/schemas/Pet' + description: Pet object that needs to be added to the store + required: true + securitySchemes: + petstore_auth: + type: oauth2 + flows: + implicit: + authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog' + scopes: + 'write:pets': modify pets in your account + 'read:pets': read your pets + api_key: + type: apiKey + name: api_key + in: header + schemas: + Order: + title: Pet Order + description: An order for a pets from the pet store + type: object + properties: + id: + type: integer + format: int64 + petId: + type: integer + format: int64 + quantity: + type: integer + format: int32 + shipDate: + type: string + format: date-time + status: + type: string + description: Order Status + enum: + - placed + - approved + - delivered + complete: + type: boolean + default: false + xml: + name: Order + Category: + title: Pet category + description: A category for a pet + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + pattern: '^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$' + xml: + name: Category + User: + title: a User + description: A User who is purchasing from the pet store + type: object + properties: + id: + type: integer + format: int64 + username: + type: string + firstName: + type: string + lastName: + type: string + email: + type: string + password: + type: string + phone: + type: string + userStatus: + type: integer + format: int32 + description: User Status + xml: + name: User + Tag: + title: Pet Tag + description: A tag for a pet + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + xml: + name: Tag + Pet: + title: a Pet + description: A pet for sale in the pet store + type: object + required: + - name + - photoUrls + properties: + id: + type: integer + format: int64 + category: + $ref: '#/components/schemas/Category' + name: + type: string + example: doggie + photoUrls: + type: array + xml: + name: photoUrl + wrapped: true + items: + type: string + tags: + type: array + xml: + name: tag + wrapped: true + items: + $ref: '#/components/schemas/Tag' + status: + type: string + description: pet status in the store + deprecated: true + enum: + - available + - pending + - sold + xml: + name: Pet + ApiResponse: + title: An uploaded response + description: Describes the result of uploading an image resource + type: object + properties: + code: + type: integer + format: int32 + type: + type: string + message: + type: string + ItemWithDollarAttributesAndExamples: + type: object + description: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + properties: + $id: + type: string + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + $name: + type: string + description: 'SQ = "; SBS = \; DBS = \\; SD = $some' + example: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" + default: "SQ = \"; SBS = \\; DBS = \\\\; SD = $some" \ No newline at end of file diff --git a/samples/documentation/html2/index.html b/samples/documentation/html2/index.html index defce7cd6ce2..d74b2161a56e 100644 --- a/samples/documentation/html2/index.html +++ b/samples/documentation/html2/index.html @@ -1216,7 +1216,7 @@

Usage and SDK Samples

// Create an instance of the API class PetApi apiInstance = new PetApi(); - Pet pet = ; // Pet | + Pet pet = ; // Pet | Pet object that needs to be added to the store try { Pet result = apiInstance.addPet(pet); @@ -1235,7 +1235,7 @@

Usage and SDK Samples

final api_instance = DefaultApi(); -final Pet pet = new Pet(); // Pet | +final Pet pet = new Pet(); // Pet | Pet object that needs to be added to the store try { final result = await api_instance.addPet(pet); @@ -1253,7 +1253,7 @@

Usage and SDK Samples

public class PetApiExample { public static void main(String[] args) { PetApi apiInstance = new PetApi(); - Pet pet = ; // Pet | + Pet pet = ; // Pet | Pet object that needs to be added to the store try { Pet result = apiInstance.addPet(pet); @@ -1278,7 +1278,7 @@

Usage and SDK Samples

// Create an instance of the API class PetApi *apiInstance = [[PetApi alloc] init]; -Pet *pet = ; // +Pet *pet = ; // Pet object that needs to be added to the store // Add a new pet to the store [apiInstance addPetWith:pet @@ -1303,7 +1303,7 @@

Usage and SDK Samples

// Create an instance of the API class var api = new OpenApiPetstore.PetApi() -var pet = ; // {Pet} +var pet = ; // {Pet} Pet object that needs to be added to the store var callback = function(error, data, response) { if (error) { @@ -1337,7 +1337,7 @@

Usage and SDK Samples

// Create an instance of the API class var apiInstance = new PetApi(); - var pet = new Pet(); // Pet | + var pet = new Pet(); // Pet | Pet object that needs to be added to the store try { // Add a new pet to the store @@ -1361,7 +1361,7 @@

Usage and SDK Samples

// Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\PetApi(); -$pet = ; // Pet | +$pet = ; // Pet | Pet object that needs to be added to the store try { $result = $api_instance->addPet($pet); @@ -1382,7 +1382,7 @@

Usage and SDK Samples

# Create an instance of the API class my $api_instance = WWW::OPenAPIClient::PetApi->new(); -my $pet = WWW::OPenAPIClient::Object::Pet->new(); # Pet | +my $pet = WWW::OPenAPIClient::Object::Pet->new(); # Pet | Pet object that needs to be added to the store eval { my $result = $api_instance->addPet(pet => $pet); @@ -1405,7 +1405,7 @@

Usage and SDK Samples

# Create an instance of the API class api_instance = openapi_client.PetApi() -pet = # Pet | +pet = # Pet | Pet object that needs to be added to the store try: # Add a new pet to the store @@ -3668,7 +3668,7 @@

Usage and SDK Samples

// Create an instance of the API class PetApi apiInstance = new PetApi(); - Pet pet = ; // Pet | + Pet pet = ; // Pet | Pet object that needs to be added to the store try { Pet result = apiInstance.updatePet(pet); @@ -3687,7 +3687,7 @@

Usage and SDK Samples

final api_instance = DefaultApi(); -final Pet pet = new Pet(); // Pet | +final Pet pet = new Pet(); // Pet | Pet object that needs to be added to the store try { final result = await api_instance.updatePet(pet); @@ -3705,7 +3705,7 @@

Usage and SDK Samples

public class PetApiExample { public static void main(String[] args) { PetApi apiInstance = new PetApi(); - Pet pet = ; // Pet | + Pet pet = ; // Pet | Pet object that needs to be added to the store try { Pet result = apiInstance.updatePet(pet); @@ -3730,7 +3730,7 @@

Usage and SDK Samples

// Create an instance of the API class PetApi *apiInstance = [[PetApi alloc] init]; -Pet *pet = ; // +Pet *pet = ; // Pet object that needs to be added to the store // Update an existing pet [apiInstance updatePetWith:pet @@ -3755,7 +3755,7 @@

Usage and SDK Samples

// Create an instance of the API class var api = new OpenApiPetstore.PetApi() -var pet = ; // {Pet} +var pet = ; // {Pet} Pet object that needs to be added to the store var callback = function(error, data, response) { if (error) { @@ -3789,7 +3789,7 @@

Usage and SDK Samples

// Create an instance of the API class var apiInstance = new PetApi(); - var pet = new Pet(); // Pet | + var pet = new Pet(); // Pet | Pet object that needs to be added to the store try { // Update an existing pet @@ -3813,7 +3813,7 @@

Usage and SDK Samples

// Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\PetApi(); -$pet = ; // Pet | +$pet = ; // Pet | Pet object that needs to be added to the store try { $result = $api_instance->updatePet($pet); @@ -3834,7 +3834,7 @@

Usage and SDK Samples

# Create an instance of the API class my $api_instance = WWW::OPenAPIClient::PetApi->new(); -my $pet = WWW::OPenAPIClient::Object::Pet->new(); # Pet | +my $pet = WWW::OPenAPIClient::Object::Pet->new(); # Pet | Pet object that needs to be added to the store eval { my $result = $api_instance->updatePet(pet => $pet); @@ -3857,7 +3857,7 @@

Usage and SDK Samples

# Create an instance of the API class api_instance = openapi_client.PetApi() -pet = # Pet | +pet = # Pet | Pet object that needs to be added to the store try: # Update an existing pet @@ -6529,7 +6529,7 @@

Usage and SDK Samples

// Create an instance of the API class StoreApi apiInstance = new StoreApi(); - Order order = ; // Order | + Order order = ; // Order | order placed for purchasing the pet try { Order result = apiInstance.placeOrder(order); @@ -6548,7 +6548,7 @@

Usage and SDK Samples

final api_instance = DefaultApi(); -final Order order = new Order(); // Order | +final Order order = new Order(); // Order | order placed for purchasing the pet try { final result = await api_instance.placeOrder(order); @@ -6566,7 +6566,7 @@

Usage and SDK Samples

public class StoreApiExample { public static void main(String[] args) { StoreApi apiInstance = new StoreApi(); - Order order = ; // Order | + Order order = ; // Order | order placed for purchasing the pet try { Order result = apiInstance.placeOrder(order); @@ -6587,7 +6587,7 @@

Usage and SDK Samples

// Create an instance of the API class StoreApi *apiInstance = [[StoreApi alloc] init]; -Order *order = ; // +Order *order = ; // order placed for purchasing the pet // Place an order for a pet [apiInstance placeOrderWith:order @@ -6607,7 +6607,7 @@

Usage and SDK Samples

// Create an instance of the API class var api = new OpenApiPetstore.StoreApi() -var order = ; // {Order} +var order = ; // {Order} order placed for purchasing the pet var callback = function(error, data, response) { if (error) { @@ -6639,7 +6639,7 @@

Usage and SDK Samples

// Create an instance of the API class var apiInstance = new StoreApi(); - var order = new Order(); // Order | + var order = new Order(); // Order | order placed for purchasing the pet try { // Place an order for a pet @@ -6660,7 +6660,7 @@

Usage and SDK Samples

// Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\StoreApi(); -$order = ; // Order | +$order = ; // Order | order placed for purchasing the pet try { $result = $api_instance->placeOrder($order); @@ -6678,7 +6678,7 @@

Usage and SDK Samples

# Create an instance of the API class my $api_instance = WWW::OPenAPIClient::StoreApi->new(); -my $order = WWW::OPenAPIClient::Object::Order->new(); # Order | +my $order = WWW::OPenAPIClient::Object::Order->new(); # Order | order placed for purchasing the pet eval { my $result = $api_instance->placeOrder(order => $order); @@ -6698,7 +6698,7 @@

Usage and SDK Samples

# Create an instance of the API class api_instance = openapi_client.StoreApi() -order = # Order | +order = # Order | order placed for purchasing the pet try: # Place an order for a pet @@ -7007,7 +7007,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi apiInstance = new UserApi(); - User user = ; // User | + User user = ; // User | Created user object try { apiInstance.createUser(user); @@ -7025,7 +7025,7 @@

Usage and SDK Samples

final api_instance = DefaultApi(); -final User user = new User(); // User | +final User user = new User(); // User | Created user object try { final result = await api_instance.createUser(user); @@ -7043,7 +7043,7 @@

Usage and SDK Samples

public class UserApiExample { public static void main(String[] args) { UserApi apiInstance = new UserApi(); - User user = ; // User | + User user = ; // User | Created user object try { apiInstance.createUser(user); @@ -7069,7 +7069,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi *apiInstance = [[UserApi alloc] init]; -User *user = ; // +User *user = ; // Created user object // Create user [apiInstance createUserWith:user @@ -7093,7 +7093,7 @@

Usage and SDK Samples

// Create an instance of the API class var api = new OpenApiPetstore.UserApi() -var user = ; // {User} +var user = ; // {User} Created user object var callback = function(error, data, response) { if (error) { @@ -7129,7 +7129,7 @@

Usage and SDK Samples

// Create an instance of the API class var apiInstance = new UserApi(); - var user = new User(); // User | + var user = new User(); // User | Created user object try { // Create user @@ -7154,7 +7154,7 @@

Usage and SDK Samples

// Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\UserApi(); -$user = ; // User | +$user = ; // User | Created user object try { $api_instance->createUser($user); @@ -7176,7 +7176,7 @@

Usage and SDK Samples

# Create an instance of the API class my $api_instance = WWW::OPenAPIClient::UserApi->new(); -my $user = WWW::OPenAPIClient::Object::User->new(); # User | +my $user = WWW::OPenAPIClient::Object::User->new(); # User | Created user object eval { $api_instance->createUser(user => $user); @@ -7200,7 +7200,7 @@

Usage and SDK Samples

# Create an instance of the API class api_instance = openapi_client.UserApi() -user = # User | +user = # User | Created user object try: # Create user @@ -7424,7 +7424,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi apiInstance = new UserApi(); - array[User] user = ; // array[User] | + array[User] user = ; // array[User] | List of user object try { apiInstance.createUsersWithArrayInput(user); @@ -7442,7 +7442,7 @@

Usage and SDK Samples

final api_instance = DefaultApi(); -final array[User] user = new array[User](); // array[User] | +final array[User] user = new array[User](); // array[User] | List of user object try { final result = await api_instance.createUsersWithArrayInput(user); @@ -7460,7 +7460,7 @@

Usage and SDK Samples

public class UserApiExample { public static void main(String[] args) { UserApi apiInstance = new UserApi(); - array[User] user = ; // array[User] | + array[User] user = ; // array[User] | List of user object try { apiInstance.createUsersWithArrayInput(user); @@ -7486,7 +7486,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi *apiInstance = [[UserApi alloc] init]; -array[User] *user = ; // +array[User] *user = ; // List of user object // Creates list of users with given input array [apiInstance createUsersWithArrayInputWith:user @@ -7510,7 +7510,7 @@

Usage and SDK Samples

// Create an instance of the API class var api = new OpenApiPetstore.UserApi() -var user = ; // {array[User]} +var user = ; // {array[User]} List of user object var callback = function(error, data, response) { if (error) { @@ -7546,7 +7546,7 @@

Usage and SDK Samples

// Create an instance of the API class var apiInstance = new UserApi(); - var user = new array[User](); // array[User] | + var user = new array[User](); // array[User] | List of user object try { // Creates list of users with given input array @@ -7571,7 +7571,7 @@

Usage and SDK Samples

// Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\UserApi(); -$user = ; // array[User] | +$user = ; // array[User] | List of user object try { $api_instance->createUsersWithArrayInput($user); @@ -7593,7 +7593,7 @@

Usage and SDK Samples

# Create an instance of the API class my $api_instance = WWW::OPenAPIClient::UserApi->new(); -my $user = [WWW::OPenAPIClient::Object::array[User]->new()]; # array[User] | +my $user = [WWW::OPenAPIClient::Object::array[User]->new()]; # array[User] | List of user object eval { $api_instance->createUsersWithArrayInput(user => $user); @@ -7617,7 +7617,7 @@

Usage and SDK Samples

# Create an instance of the API class api_instance = openapi_client.UserApi() -user = # array[User] | +user = # array[User] | List of user object try: # Creates list of users with given input array @@ -7844,7 +7844,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi apiInstance = new UserApi(); - array[User] user = ; // array[User] | + array[User] user = ; // array[User] | List of user object try { apiInstance.createUsersWithListInput(user); @@ -7862,7 +7862,7 @@

Usage and SDK Samples

final api_instance = DefaultApi(); -final array[User] user = new array[User](); // array[User] | +final array[User] user = new array[User](); // array[User] | List of user object try { final result = await api_instance.createUsersWithListInput(user); @@ -7880,7 +7880,7 @@

Usage and SDK Samples

public class UserApiExample { public static void main(String[] args) { UserApi apiInstance = new UserApi(); - array[User] user = ; // array[User] | + array[User] user = ; // array[User] | List of user object try { apiInstance.createUsersWithListInput(user); @@ -7906,7 +7906,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi *apiInstance = [[UserApi alloc] init]; -array[User] *user = ; // +array[User] *user = ; // List of user object // Creates list of users with given input array [apiInstance createUsersWithListInputWith:user @@ -7930,7 +7930,7 @@

Usage and SDK Samples

// Create an instance of the API class var api = new OpenApiPetstore.UserApi() -var user = ; // {array[User]} +var user = ; // {array[User]} List of user object var callback = function(error, data, response) { if (error) { @@ -7966,7 +7966,7 @@

Usage and SDK Samples

// Create an instance of the API class var apiInstance = new UserApi(); - var user = new array[User](); // array[User] | + var user = new array[User](); // array[User] | List of user object try { // Creates list of users with given input array @@ -7991,7 +7991,7 @@

Usage and SDK Samples

// Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\UserApi(); -$user = ; // array[User] | +$user = ; // array[User] | List of user object try { $api_instance->createUsersWithListInput($user); @@ -8013,7 +8013,7 @@

Usage and SDK Samples

# Create an instance of the API class my $api_instance = WWW::OPenAPIClient::UserApi->new(); -my $user = [WWW::OPenAPIClient::Object::array[User]->new()]; # array[User] | +my $user = [WWW::OPenAPIClient::Object::array[User]->new()]; # array[User] | List of user object eval { $api_instance->createUsersWithListInput(user => $user); @@ -8037,7 +8037,7 @@

Usage and SDK Samples

# Create an instance of the API class api_instance = openapi_client.UserApi() -user = # array[User] | +user = # array[User] | List of user object try: # Creates list of users with given input array @@ -10096,7 +10096,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi apiInstance = new UserApi(); String username = username_example; // String | name that need to be deleted - User user = ; // User | + User user = ; // User | Updated user object try { apiInstance.updateUser(username, user); @@ -10115,7 +10115,7 @@

Usage and SDK Samples

final api_instance = DefaultApi(); final String username = new String(); // String | name that need to be deleted -final User user = new User(); // User | +final User user = new User(); // User | Updated user object try { final result = await api_instance.updateUser(username, user); @@ -10134,7 +10134,7 @@

Usage and SDK Samples

public static void main(String[] args) { UserApi apiInstance = new UserApi(); String username = username_example; // String | name that need to be deleted - User user = ; // User | + User user = ; // User | Updated user object try { apiInstance.updateUser(username, user); @@ -10161,7 +10161,7 @@

Usage and SDK Samples

// Create an instance of the API class UserApi *apiInstance = [[UserApi alloc] init]; String *username = username_example; // name that need to be deleted (default to null) -User *user = ; // +User *user = ; // Updated user object // Updated user [apiInstance updateUserWith:username @@ -10187,7 +10187,7 @@

Usage and SDK Samples

// Create an instance of the API class var api = new OpenApiPetstore.UserApi() var username = username_example; // {String} name that need to be deleted -var user = ; // {User} +var user = ; // {User} Updated user object var callback = function(error, data, response) { if (error) { @@ -10224,7 +10224,7 @@

Usage and SDK Samples

// Create an instance of the API class var apiInstance = new UserApi(); var username = username_example; // String | name that need to be deleted (default to null) - var user = new User(); // User | + var user = new User(); // User | Updated user object try { // Updated user @@ -10250,7 +10250,7 @@

Usage and SDK Samples

// Create an instance of the API class $api_instance = new OpenAPITools\Client\Api\UserApi(); $username = username_example; // String | name that need to be deleted -$user = ; // User | +$user = ; // User | Updated user object try { $api_instance->updateUser($username, $user); @@ -10273,7 +10273,7 @@

Usage and SDK Samples

# Create an instance of the API class my $api_instance = WWW::OPenAPIClient::UserApi->new(); my $username = username_example; # String | name that need to be deleted -my $user = WWW::OPenAPIClient::Object::User->new(); # User | +my $user = WWW::OPenAPIClient::Object::User->new(); # User | Updated user object eval { $api_instance->updateUser(username => $username, user => $user); @@ -10298,7 +10298,7 @@

Usage and SDK Samples

# Create an instance of the API class api_instance = openapi_client.UserApi() username = username_example # String | name that need to be deleted (default to null) -user = # User | +user = # User | Updated user object try: # Updated user diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/.openapi-generator/FILES b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/.openapi-generator/FILES index 18f6d4999914..7a299e837265 100644 --- a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/.openapi-generator/FILES @@ -6,10 +6,14 @@ gradlew gradlew.bat pom.xml settings.gradle +src/main/kotlin/org/openapitools/api/DefaultApiClient.kt src/main/kotlin/org/openapitools/api/PetApiClient.kt src/main/kotlin/org/openapitools/api/StoreApiClient.kt src/main/kotlin/org/openapitools/api/UserApiClient.kt src/main/kotlin/org/openapitools/model/Category.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt src/main/kotlin/org/openapitools/model/ModelApiResponse.kt src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt new file mode 100644 index 000000000000..6fe0db391743 --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt @@ -0,0 +1,63 @@ +/** +* NOTE: Auto generated by OpenAPI Generator (7.18.0-SNAPSHOT) +* Spring 6 Declarative HTTP Interface +*/ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response + +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* + +import org.springframework.web.service.annotation.* +import org.springframework.web.bind.annotation.* +import org.springframework.http.HttpStatus + +import org.springframework.validation.annotation.Validated +import jakarta.validation.Valid +import jakarta.validation.constraints.* + + +import kotlin.collections.List +import kotlin.collections.Map + +@Validated +interface DefaultApi { + + @ResponseStatus(HttpStatus.OK) + @HttpExchange( + url = PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item\$Id}/something/{item\$SubId}" */, + method = "GET" + ) + suspend fun itemsItemIdSomethingItemSubIdGet( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String? + ): ItemsItemIdSomethingItemSubIdGet200Response + + @ResponseStatus(HttpStatus.CREATED) + @HttpExchange( + url = PATH_ITEMS_POST /* "/items" */, + method = "POST" + ) + suspend fun itemsPost( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + ): ItemWithDollarAttributesAndExamples + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..c72ad5e772ca --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..a892b615afa7 --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..9a960bec6b6c --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-coroutines/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "42", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/.openapi-generator/FILES b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/.openapi-generator/FILES index 18f6d4999914..7a299e837265 100644 --- a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/.openapi-generator/FILES @@ -6,10 +6,14 @@ gradlew gradlew.bat pom.xml settings.gradle +src/main/kotlin/org/openapitools/api/DefaultApiClient.kt src/main/kotlin/org/openapitools/api/PetApiClient.kt src/main/kotlin/org/openapitools/api/StoreApiClient.kt src/main/kotlin/org/openapitools/api/UserApiClient.kt src/main/kotlin/org/openapitools/model/Category.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt src/main/kotlin/org/openapitools/model/ModelApiResponse.kt src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt new file mode 100644 index 000000000000..c6c37b77d436 --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt @@ -0,0 +1,65 @@ +/** +* NOTE: Auto generated by OpenAPI Generator (7.18.0-SNAPSHOT) +* Spring 6 Declarative HTTP Interface +*/ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response + +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* + +import org.springframework.web.service.annotation.* +import org.springframework.web.bind.annotation.* +import org.springframework.http.ResponseEntity + +import org.springframework.validation.annotation.Validated +import jakarta.validation.Valid +import jakarta.validation.constraints.* + +import reactor.core.publisher.Flux +import reactor.core.publisher.Mono + +import kotlin.collections.List +import kotlin.collections.Map + +@Validated +interface DefaultApi { + + @HttpExchange( + url = PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item\$Id}/something/{item\$SubId}" */, + method = "GET" + ) + fun itemsItemIdSomethingItemSubIdGet( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String? + ): Mono> + + + @HttpExchange( + url = PATH_ITEMS_POST /* "/items" */, + method = "POST" + ) + fun itemsPost( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + ): Mono> + + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..c72ad5e772ca --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..a892b615afa7 --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..9a960bec6b6c --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-reactive-reactor-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "42", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/.openapi-generator/FILES b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/.openapi-generator/FILES index 18f6d4999914..7a299e837265 100644 --- a/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/.openapi-generator/FILES @@ -6,10 +6,14 @@ gradlew gradlew.bat pom.xml settings.gradle +src/main/kotlin/org/openapitools/api/DefaultApiClient.kt src/main/kotlin/org/openapitools/api/PetApiClient.kt src/main/kotlin/org/openapitools/api/StoreApiClient.kt src/main/kotlin/org/openapitools/api/UserApiClient.kt src/main/kotlin/org/openapitools/model/Category.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt src/main/kotlin/org/openapitools/model/ModelApiResponse.kt src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt new file mode 100644 index 000000000000..0497c8fd65e7 --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt @@ -0,0 +1,63 @@ +/** +* NOTE: Auto generated by OpenAPI Generator (7.18.0-SNAPSHOT) +* Spring 6 Declarative HTTP Interface +*/ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response + +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* + +import org.springframework.web.service.annotation.* +import org.springframework.web.bind.annotation.* +import org.springframework.http.ResponseEntity + +import org.springframework.validation.annotation.Validated +import jakarta.validation.Valid +import jakarta.validation.constraints.* + + +import kotlin.collections.List +import kotlin.collections.Map + +@Validated +interface DefaultApi { + + @HttpExchange( + url = PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item\$Id}/something/{item\$SubId}" */, + method = "GET" + ) + fun itemsItemIdSomethingItemSubIdGet( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String? + ): ResponseEntity + + + @HttpExchange( + url = PATH_ITEMS_POST /* "/items" */, + method = "POST" + ) + fun itemsPost( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + ): ResponseEntity + + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..c72ad5e772ca --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..a892b615afa7 --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..9a960bec6b6c --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface-wrapped/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "42", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface/.openapi-generator/FILES b/samples/server/petstore/kotlin-spring-declarative-interface/.openapi-generator/FILES index 18f6d4999914..7a299e837265 100644 --- a/samples/server/petstore/kotlin-spring-declarative-interface/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-spring-declarative-interface/.openapi-generator/FILES @@ -6,10 +6,14 @@ gradlew gradlew.bat pom.xml settings.gradle +src/main/kotlin/org/openapitools/api/DefaultApiClient.kt src/main/kotlin/org/openapitools/api/PetApiClient.kt src/main/kotlin/org/openapitools/api/StoreApiClient.kt src/main/kotlin/org/openapitools/api/UserApiClient.kt src/main/kotlin/org/openapitools/model/Category.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt src/main/kotlin/org/openapitools/model/ModelApiResponse.kt src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt diff --git a/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt new file mode 100644 index 000000000000..0497c8fd65e7 --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/api/DefaultApiClient.kt @@ -0,0 +1,63 @@ +/** +* NOTE: Auto generated by OpenAPI Generator (7.18.0-SNAPSHOT) +* Spring 6 Declarative HTTP Interface +*/ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response + +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* + +import org.springframework.web.service.annotation.* +import org.springframework.web.bind.annotation.* +import org.springframework.http.ResponseEntity + +import org.springframework.validation.annotation.Validated +import jakarta.validation.Valid +import jakarta.validation.constraints.* + + +import kotlin.collections.List +import kotlin.collections.Map + +@Validated +interface DefaultApi { + + @HttpExchange( + url = PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item\$Id}/something/{item\$SubId}" */, + method = "GET" + ) + fun itemsItemIdSomethingItemSubIdGet( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String? + ): ResponseEntity + + + @HttpExchange( + url = PATH_ITEMS_POST /* "/items" */, + method = "POST" + ) + fun itemsPost( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + ): ResponseEntity + + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..c72ad5e772ca --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..a892b615afa7 --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..9a960bec6b6c --- /dev/null +++ b/samples/server/petstore/kotlin-spring-declarative-interface/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "42", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator-ignore b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator-ignore new file mode 100644 index 000000000000..7484ee590a38 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/FILES new file mode 100644 index 000000000000..65587b352876 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/FILES @@ -0,0 +1,24 @@ +README.md +build.gradle.kts +gradle/wrapper/gradle-wrapper.jar +gradle/wrapper/gradle-wrapper.properties +gradlew +gradlew.bat +pom.xml +settings.gradle +src/main/kotlin/org/openapitools/SpringDocConfiguration.kt +src/main/kotlin/org/openapitools/api/ApiUtil.kt +src/main/kotlin/org/openapitools/api/Exceptions.kt +src/main/kotlin/org/openapitools/api/ItemsApi.kt +src/main/kotlin/org/openapitools/api/PetApi.kt +src/main/kotlin/org/openapitools/api/StoreApi.kt +src/main/kotlin/org/openapitools/api/UserApi.kt +src/main/kotlin/org/openapitools/model/Category.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt +src/main/kotlin/org/openapitools/model/ModelApiResponse.kt +src/main/kotlin/org/openapitools/model/Order.kt +src/main/kotlin/org/openapitools/model/Pet.kt +src/main/kotlin/org/openapitools/model/Tag.kt +src/main/kotlin/org/openapitools/model/User.kt diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/VERSION b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/VERSION new file mode 100644 index 000000000000..2fb556b60635 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.18.0-SNAPSHOT diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/README.md b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/README.md new file mode 100644 index 000000000000..b6865a081135 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/README.md @@ -0,0 +1,21 @@ +# openAPIPetstore + +This Kotlin based [Spring Boot](https://spring.io/projects/spring-boot) application has been generated using the [OpenAPI Generator](https://github.com/OpenAPITools/openapi-generator). + +## Getting Started + +This document assumes you have either maven or gradle available, either via the wrapper or otherwise. This does not come with a gradle / maven wrapper checked in. + +By default a [`pom.xml`](pom.xml) file will be generated. If you specified `gradleBuildFile=true` when generating this project, a `build.gradle.kts` will also be generated. Note this uses [Gradle Kotlin DSL](https://github.com/gradle/kotlin-dsl). + +To build the project using maven, run: +```bash +mvn package && java -jar target/openapi-spring-1.0.0.jar +``` + +To build the project using gradle, run: +```bash +gradle build && java -jar build/libs/openapi-spring-1.0.0.jar +``` + +If all builds successfully, the server should run on [http://localhost:8080/](http://localhost:8080/) diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/build.gradle.kts b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/build.gradle.kts new file mode 100644 index 000000000000..a064415b6540 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/build.gradle.kts @@ -0,0 +1,47 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +group = "org.openapitools" +version = "1.0.0" +java.sourceCompatibility = JavaVersion.VERSION_17 + +repositories { + mavenCentral() + maven { url = uri("https://repo.spring.io/milestone") } +} + +tasks.withType { + kotlinOptions.jvmTarget = "17" +} + +tasks.bootJar { + enabled = false +} + +plugins { + val kotlinVersion = "1.9.25" + id("org.jetbrains.kotlin.jvm") version kotlinVersion + id("org.jetbrains.kotlin.plugin.jpa") version kotlinVersion + id("org.jetbrains.kotlin.plugin.spring") version kotlinVersion + id("org.springframework.boot") version "3.0.2" + id("io.spring.dependency-management") version "1.0.14.RELEASE" +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springdoc:springdoc-openapi-starter-webmvc-api:2.6.0") + + implementation("com.google.code.findbugs:jsr305:3.0.2") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + implementation("jakarta.validation:jakarta.validation-api") + implementation("jakarta.annotation:jakarta.annotation-api:2.1.0") + + testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") + testImplementation("org.springframework.boot:spring-boot-starter-test") { + exclude(module = "junit") + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradle/wrapper/gradle-wrapper.jar b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000000..e6441136f3d4 Binary files /dev/null and b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradle/wrapper/gradle-wrapper.jar differ diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradle/wrapper/gradle-wrapper.properties b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..80187ac30432 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradlew b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradlew new file mode 100644 index 000000000000..9d0ce634cb11 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while +APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path +[ -h "$app_path" ] +do +ls=$( ls -ld "$app_path" ) +link=${ls#*' -> '} +case $link in #( +/*) app_path=$link ;; #( +*) app_path=$APP_HOME$link ;; +esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { +echo "$*" +} >&2 + +die () { +echo +echo "$*" +echo +exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( +CYGWIN* ) cygwin=true ;; #( +Darwin* ) darwin=true ;; #( +MSYS* | MINGW* ) msys=true ;; #( +NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then +if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +# IBM's JDK on AIX uses strange locations for the executables +JAVACMD=$JAVA_HOME/jre/sh/java +else +JAVACMD=$JAVA_HOME/bin/java +fi +if [ ! -x "$JAVACMD" ] ; then +die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +else +JAVACMD=java +if ! command -v java >/dev/null 2>&1 +then +die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then +case $MAX_FD in #( +max*) +# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +MAX_FD=$( ulimit -H -n ) || +warn "Could not query maximum file descriptor limit" +esac +case $MAX_FD in #( +'' | soft) :;; #( +*) +# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +ulimit -n "$MAX_FD" || +warn "Could not set maximum file descriptor limit to $MAX_FD" +esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then +APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) +CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + +JAVACMD=$( cygpath --unix "$JAVACMD" ) + +# Now convert the arguments - kludge to limit ourselves to /bin/sh +for arg do +if +case $arg in #( +-*) false ;; # don't mess with options #( +/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath +[ -e "$t" ] ;; #( +*) false ;; +esac +then +arg=$( cygpath --path --ignore --mixed "$arg" ) +fi +# Roll the args list around exactly as many times as the number of +# args, so each arg winds up back in the position where it started, but +# possibly modified. +# +# NB: a `for` loop captures its iteration list before it begins, so +# changing the positional parameters here affects neither the number of +# iterations, nor the values presented in `arg`. +shift # remove old arg +set -- "$@" "$arg" # push replacement arg +done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ +"-Dorg.gradle.appname=$APP_BASE_NAME" \ +-classpath "$CLASSPATH" \ +org.gradle.wrapper.GradleWrapperMain \ +"$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then +die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( +printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | +xargs -n1 | +sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | +tr '\n' ' ' +)" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradlew.bat b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradlew.bat new file mode 100644 index 000000000000..25da30dbdeee --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/pom.xml b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/pom.xml new file mode 100644 index 000000000000..d3d44b8d2b04 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/pom.xml @@ -0,0 +1,149 @@ + + 4.0.0 + org.openapitools + openapi-spring + jar + openapi-spring + 1.0.0 + + 3.0.2 + 2.1.0 + 1.7.10 + + 1.7.10 + UTF-8 + + + org.springframework.boot + spring-boot-starter-parent + 3.1.3 + + + + repository.spring.milestone + Spring Milestone Repository + https://repo.spring.io/milestone + + + + + spring-milestones + https://repo.spring.io/milestone + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin.version} + + + spring + + 17 + + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springdoc + springdoc-openapi-webmvc-core + ${springdoc-openapi.version} + + + + + com.google.code.findbugs + jsr305 + ${findbugs-jsr305.version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + com.fasterxml.jackson.module + jackson-module-kotlin + + + + jakarta.validation + jakarta.validation-api + + + jakarta.annotation + jakarta.annotation-api + ${jakarta-annotation.version} + provided + + + org.jetbrains.kotlin + kotlin-test-junit5 + ${kotlin-test-junit5.version} + test + + + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/settings.gradle b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/settings.gradle new file mode 100644 index 000000000000..14844905cd40 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/settings.gradle @@ -0,0 +1,15 @@ +pluginManagement { + repositories { + maven { url = uri("https://repo.spring.io/snapshot") } + maven { url = uri("https://repo.spring.io/milestone") } + gradlePluginPortal() + } + resolutionStrategy { + eachPlugin { + if (requested.id.id == "org.springframework.boot") { + useModule("org.springframework.boot:spring-boot-gradle-plugin:${requested.version}") + } + } + } +} +rootProject.name = "openapi-spring" diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/SpringDocConfiguration.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/SpringDocConfiguration.kt new file mode 100644 index 000000000000..ab4d5eb17b86 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/SpringDocConfiguration.kt @@ -0,0 +1,42 @@ +package org.openapitools + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +import io.swagger.v3.oas.models.OpenAPI +import io.swagger.v3.oas.models.info.Info +import io.swagger.v3.oas.models.info.Contact +import io.swagger.v3.oas.models.info.License +import io.swagger.v3.oas.models.Components +import io.swagger.v3.oas.models.security.SecurityScheme + +@Configuration +class SpringDocConfiguration { + + @Bean + fun apiInfo(): OpenAPI { + return OpenAPI() + .info( + Info() + .title("OpenAPI Petstore") + .description("This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.") + .license( + License() + .name("Apache-2.0") + .url("https://www.apache.org/licenses/LICENSE-2.0.html") + ) + .version("1.0.0") + ) + .components( + Components() + .addSecuritySchemes("petstore_auth", SecurityScheme() + .type(SecurityScheme.Type.OAUTH2) + ) + .addSecuritySchemes("api_key", SecurityScheme() + .type(SecurityScheme.Type.APIKEY) + .`in`(SecurityScheme.In.HEADER) + .name("api_key") + ) + ) + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/ApiUtil.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/ApiUtil.kt new file mode 100644 index 000000000000..03344e13b474 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/ApiUtil.kt @@ -0,0 +1,19 @@ +package org.openapitools.api + +import org.springframework.web.context.request.NativeWebRequest + +import jakarta.servlet.http.HttpServletResponse +import java.io.IOException + +object ApiUtil { + fun setExampleResponse(req: NativeWebRequest, contentType: String, example: String) { + try { + val res = req.getNativeResponse(HttpServletResponse::class.java) + res?.characterEncoding = "UTF-8" + res?.addHeader("Content-Type", contentType) + res?.writer?.print(example) + } catch (e: IOException) { + throw RuntimeException(e) + } + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/Exceptions.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/Exceptions.kt new file mode 100644 index 000000000000..1bd78f54576a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/Exceptions.kt @@ -0,0 +1,30 @@ +package org.openapitools.api + +import org.springframework.context.annotation.Configuration +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.ControllerAdvice +import org.springframework.web.bind.annotation.ExceptionHandler +import jakarta.servlet.http.HttpServletResponse +import jakarta.validation.ConstraintViolationException + +// TODO Extend ApiException for custom exception handling, e.g. the below NotFound exception +sealed class ApiException(msg: String, val code: Int) : Exception(msg) + +class NotFoundException(msg: String, code: Int = HttpStatus.NOT_FOUND.value()) : ApiException(msg, code) + +@Configuration("org.openapitools.api.DefaultExceptionHandler") +@ControllerAdvice +class DefaultExceptionHandler { + + @ExceptionHandler(value = [ApiException::class]) + fun onApiException(ex: ApiException, response: HttpServletResponse): Unit = + response.sendError(ex.code, ex.message) + + @ExceptionHandler(value = [NotImplementedError::class]) + fun onNotImplemented(ex: NotImplementedError, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.NOT_IMPLEMENTED.value()) + + @ExceptionHandler(value = [ConstraintViolationException::class]) + fun onConstraintViolation(ex: ConstraintViolationException, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.BAD_REQUEST.value(), ex.constraintViolations.joinToString(", ") { it.message }) +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/ItemsApi.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/ItemsApi.kt new file mode 100644 index 000000000000..25d8fa0f4ed9 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/ItemsApi.kt @@ -0,0 +1,99 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. +*/ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.ItemsApi.Companion.BASE_PATH + +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +interface ItemsApi { + + @Operation( + tags = ["default",], + summary = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + operationId = "itemsItemIdSomethingItemSubIdGet", + description = """SQ = "; SBS = \; DBS = \\; SD = ${'$'}some""", + responses = [ + ApiResponse(responseCode = "200", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", content = [Content(schema = Schema(implementation = ItemsItemIdSomethingItemSubIdGet200Response::class))]) + ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item$Id}/something/{item$SubId}" */], + produces = ["application/json"] + ) + fun itemsItemIdSomethingItemSubIdGet( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String? + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["default",], + summary = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + operationId = "itemsPost", + description = """SQ = "; SBS = \; DBS = \\; SD = ${'$'}some""", + responses = [ + ApiResponse(responseCode = "201", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", content = [Content(schema = Schema(implementation = ItemWithDollarAttributesAndExamples::class))]) + ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ITEMS_POST /* "/items" */], + produces = ["application/json"], + consumes = ["application/x-www-form-urlencoded"] + ) + fun itemsPost( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/PetApi.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/PetApi.kt new file mode 100644 index 000000000000..80daa9dac69d --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/PetApi.kt @@ -0,0 +1,238 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. +*/ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.PetApi.Companion.BASE_PATH + +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +interface PetApi { + + @Operation( + tags = ["pet",], + summary = "Add a new pet to the store", + operationId = "addPet", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Pet::class))]), + ApiResponse(responseCode = "405", description = "Invalid input") + ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ADD_PET /* "/pet" */], + produces = ["application/xml", "application/json"], + consumes = ["application/json", "application/xml"] + ) + fun addPet( + @Parameter(description = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody pet: Pet + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["pet",], + summary = "Deletes a pet", + operationId = "deletePet", + description = """""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid pet value") + ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_PET /* "/pet/{petId}" */] + ) + fun deletePet( + @Parameter(description = "Pet id to delete", required = true) @PathVariable("petId") petId: kotlin.Long, + @Parameter(description = "", `in` = ParameterIn.HEADER) @RequestHeader(value = "api_key", required = false) apiKey: kotlin.String? + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["pet",], + summary = "Finds Pets by status", + operationId = "findPetsByStatus", + description = """Multiple status values can be provided with comma separated strings""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(array = ArraySchema(schema = Schema(implementation = Pet::class)))]), + ApiResponse(responseCode = "400", description = "Invalid status value") + ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_FIND_PETS_BY_STATUS /* "/pet/findByStatus" */], + produces = ["application/xml", "application/json"] + ) + fun findPetsByStatus( + @NotNull @Parameter(description = "Status values that need to be considered for filter", required = true, schema = Schema(allowableValues = ["available", "pending", "sold"])) @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List + ): ResponseEntity> { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["pet",], + summary = "Finds Pets by tags", + operationId = "findPetsByTags", + description = """Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(array = ArraySchema(schema = Schema(implementation = Pet::class)))]), + ApiResponse(responseCode = "400", description = "Invalid tag value") + ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_FIND_PETS_BY_TAGS /* "/pet/findByTags" */], + produces = ["application/xml", "application/json"] + ) + fun findPetsByTags( + @NotNull @Parameter(description = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List + ): ResponseEntity> { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["pet",], + summary = "Find pet by ID", + operationId = "getPetById", + description = """Returns a single pet""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Pet::class))]), + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Pet not found") + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_PET_BY_ID /* "/pet/{petId}" */], + produces = ["application/xml", "application/json"] + ) + fun getPetById( + @Parameter(description = "ID of pet to return", required = true) @PathVariable("petId") petId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["pet",], + summary = "Update an existing pet", + operationId = "updatePet", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Pet::class))]), + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Pet not found"), + ApiResponse(responseCode = "405", description = "Validation exception") + ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.PUT], + value = [PATH_UPDATE_PET /* "/pet" */], + produces = ["application/xml", "application/json"], + consumes = ["application/json", "application/xml"] + ) + fun updatePet( + @Parameter(description = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody pet: Pet + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["pet",], + summary = "Updates a pet in the store with form data", + operationId = "updatePetWithForm", + description = """""", + responses = [ + ApiResponse(responseCode = "405", description = "Invalid input") + ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPDATE_PET_WITH_FORM /* "/pet/{petId}" */], + consumes = ["application/x-www-form-urlencoded"] + ) + fun updatePetWithForm( + @Parameter(description = "ID of pet that needs to be updated", required = true) @PathVariable("petId") petId: kotlin.Long, + @Parameter(description = "Updated name of the pet") @Valid @RequestParam(value = "name", required = false) name: kotlin.String?, + @Parameter(description = "Updated status of the pet") @Valid @RequestParam(value = "status", required = false) status: kotlin.String? + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["pet",], + summary = "uploads an image", + operationId = "uploadFile", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = ModelApiResponse::class))]) + ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPLOAD_FILE /* "/pet/{petId}/uploadImage" */], + produces = ["application/json"], + consumes = ["multipart/form-data"] + ) + fun uploadFile( + @Parameter(description = "ID of pet to update", required = true) @PathVariable("petId") petId: kotlin.Long, + @Parameter(description = "Additional data to pass to server") @Valid @RequestParam(value = "additionalMetadata", required = false) additionalMetadata: kotlin.String?, + @Parameter(description = "file to upload") @Valid @RequestPart("file", required = false) file: org.springframework.web.multipart.MultipartFile + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + const val PATH_ADD_PET: String = "/pet" + const val PATH_DELETE_PET: String = "/pet/{petId}" + const val PATH_FIND_PETS_BY_STATUS: String = "/pet/findByStatus" + const val PATH_FIND_PETS_BY_TAGS: String = "/pet/findByTags" + const val PATH_GET_PET_BY_ID: String = "/pet/{petId}" + const val PATH_UPDATE_PET: String = "/pet" + const val PATH_UPDATE_PET_WITH_FORM: String = "/pet/{petId}" + const val PATH_UPLOAD_FILE: String = "/pet/{petId}/uploadImage" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/StoreApi.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/StoreApi.kt new file mode 100644 index 000000000000..abcae142295a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/StoreApi.kt @@ -0,0 +1,133 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. +*/ +package org.openapitools.api + +import org.openapitools.model.Order +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.StoreApi.Companion.BASE_PATH + +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +interface StoreApi { + + @Operation( + tags = ["store",], + summary = "Delete purchase order by ID", + operationId = "deleteOrder", + description = """For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Order not found") + ] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_ORDER /* "/store/order/{orderId}" */] + ) + fun deleteOrder( + @Parameter(description = "ID of the order that needs to be deleted", required = true) @PathVariable("orderId") orderId: kotlin.String + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["store",], + summary = "Returns pet inventories by status", + operationId = "getInventory", + description = """Returns a map of status codes to quantities""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = kotlin.collections.Map::class))]) + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_INVENTORY /* "/store/inventory" */], + produces = ["application/json"] + ) + fun getInventory(): ResponseEntity> { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["store",], + summary = "Find purchase order by ID", + operationId = "getOrderById", + description = """For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Order::class))]), + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Order not found") + ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_ORDER_BY_ID /* "/store/order/{orderId}" */], + produces = ["application/xml", "application/json"] + ) + fun getOrderById( + @Min(value=1L) @Max(value=5L) @Parameter(description = "ID of pet that needs to be fetched", required = true) @PathVariable("orderId") orderId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["store",], + summary = "Place an order for a pet", + operationId = "placeOrder", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Order::class))]), + ApiResponse(responseCode = "400", description = "Invalid Order") + ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_PLACE_ORDER /* "/store/order" */], + produces = ["application/xml", "application/json"], + consumes = ["application/json"] + ) + fun placeOrder( + @Parameter(description = "order placed for purchasing the pet", required = true) @Valid @RequestBody order: Order + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + const val PATH_DELETE_ORDER: String = "/store/order/{orderId}" + const val PATH_GET_INVENTORY: String = "/store/inventory" + const val PATH_GET_ORDER_BY_ID: String = "/store/order/{orderId}" + const val PATH_PLACE_ORDER: String = "/store/order" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/UserApi.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/UserApi.kt new file mode 100644 index 000000000000..587f3b5817ca --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/api/UserApi.kt @@ -0,0 +1,223 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. +*/ +package org.openapitools.api + +import org.openapitools.model.User +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.UserApi.Companion.BASE_PATH + +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +interface UserApi { + + @Operation( + tags = ["user",], + summary = "Create user", + operationId = "createUser", + description = """This can only be done by the logged in user.""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USER /* "/user" */], + consumes = ["application/json"] + ) + fun createUser( + @Parameter(description = "Created user object", required = true) @Valid @RequestBody user: User + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["user",], + summary = "Creates list of users with given input array", + operationId = "createUsersWithArrayInput", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USERS_WITH_ARRAY_INPUT /* "/user/createWithArray" */], + consumes = ["application/json"] + ) + fun createUsersWithArrayInput( + @Parameter(description = "List of user object", required = true) @Valid @RequestBody user: kotlin.collections.List + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["user",], + summary = "Creates list of users with given input array", + operationId = "createUsersWithListInput", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USERS_WITH_LIST_INPUT /* "/user/createWithList" */], + consumes = ["application/json"] + ) + fun createUsersWithListInput( + @Parameter(description = "List of user object", required = true) @Valid @RequestBody user: kotlin.collections.List + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["user",], + summary = "Delete user", + operationId = "deleteUser", + description = """This can only be done by the logged in user.""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid username supplied"), + ApiResponse(responseCode = "404", description = "User not found") + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_USER /* "/user/{username}" */] + ) + fun deleteUser( + @Parameter(description = "The name that needs to be deleted", required = true) @PathVariable("username") username: kotlin.String + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["user",], + summary = "Get user by user name", + operationId = "getUserByName", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = User::class))]), + ApiResponse(responseCode = "400", description = "Invalid username supplied"), + ApiResponse(responseCode = "404", description = "User not found") + ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_USER_BY_NAME /* "/user/{username}" */], + produces = ["application/xml", "application/json"] + ) + fun getUserByName( + @Parameter(description = "The name that needs to be fetched. Use user1 for testing.", required = true) @PathVariable("username") username: kotlin.String + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["user",], + summary = "Logs user into the system", + operationId = "loginUser", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = kotlin.String::class))]), + ApiResponse(responseCode = "400", description = "Invalid username/password supplied") + ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_LOGIN_USER /* "/user/login" */], + produces = ["application/xml", "application/json"] + ) + fun loginUser( + @NotNull @Pattern(regexp="^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$") @Parameter(description = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) username: kotlin.String, + @NotNull @Parameter(description = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) password: kotlin.String + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["user",], + summary = "Logs out current logged in user session", + operationId = "logoutUser", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_LOGOUT_USER /* "/user/logout" */] + ) + fun logoutUser(): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + @Operation( + tags = ["user",], + summary = "Updated user", + operationId = "updateUser", + description = """This can only be done by the logged in user.""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid user supplied"), + ApiResponse(responseCode = "404", description = "User not found") + ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.PUT], + value = [PATH_UPDATE_USER /* "/user/{username}" */], + consumes = ["application/json"] + ) + fun updateUser( + @Parameter(description = "name that need to be deleted", required = true) @PathVariable("username") username: kotlin.String, + @Parameter(description = "Updated user object", required = true) @Valid @RequestBody user: User + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + const val PATH_CREATE_USER: String = "/user" + const val PATH_CREATE_USERS_WITH_ARRAY_INPUT: String = "/user/createWithArray" + const val PATH_CREATE_USERS_WITH_LIST_INPUT: String = "/user/createWithList" + const val PATH_DELETE_USER: String = "/user/{username}" + const val PATH_GET_USER_BY_NAME: String = "/user/{username}" + const val PATH_LOGIN_USER: String = "/user/login" + const val PATH_LOGOUT_USER: String = "/user/logout" + const val PATH_UPDATE_USER: String = "/user/{username}" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Category.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Category.kt new file mode 100644 index 000000000000..4d38e2f38b0c --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Category.kt @@ -0,0 +1,37 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A category for a pet + * @param id + * @param name + */ +data class Category( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @get:Pattern(regexp="^[a-zA-Z0-9]+[a-zA-Z0-9\\.\\-_]*[a-zA-Z0-9]+$") + @Schema(example = "null", description = "") + @get:JsonProperty("name") val name: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..c72ad5e772ca --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..a892b615afa7 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..9a960bec6b6c --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "42", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt new file mode 100644 index 000000000000..b94f16fe0c34 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt @@ -0,0 +1,40 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * Describes the result of uploading an image resource + * @param code + * @param type + * @param message + */ +data class ModelApiResponse( + + @Schema(example = "null", description = "") + @get:JsonProperty("code") val code: kotlin.Int? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("type") val type: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("message") val message: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Order.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Order.kt new file mode 100644 index 000000000000..f1f9dd136e4d --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Order.kt @@ -0,0 +1,74 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * An order for a pets from the pet store + * @param id + * @param petId + * @param quantity + * @param shipDate + * @param status Order Status + * @param complete + */ +data class Order( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("petId") val petId: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("quantity") val quantity: kotlin.Int? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("shipDate") val shipDate: java.time.OffsetDateTime? = null, + + @Schema(example = "null", description = "Order Status") + @get:JsonProperty("status") val status: Order.Status? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("complete") val complete: kotlin.Boolean? = false +) : Serializable { + + /** + * Order Status + * Values: placed,approved,delivered + */ + enum class Status(@get:JsonValue val value: kotlin.String) { + + placed("placed"), + approved("approved"), + delivered("delivered"); + + companion object { + @JvmStatic + @JsonCreator + fun forValue(value: kotlin.String): Status { + return values().firstOrNull{it -> it.value == value} + ?: throw IllegalArgumentException("Unexpected value '$value' for enum 'Order'") + } + } + } + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Pet.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Pet.kt new file mode 100644 index 000000000000..e644f12f163d --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Pet.kt @@ -0,0 +1,79 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import org.openapitools.model.Category +import org.openapitools.model.Tag +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A pet for sale in the pet store + * @param name + * @param photoUrls + * @param id + * @param category + * @param tags + * @param status pet status in the store + */ +data class Pet( + + @Schema(example = "doggie", required = true, description = "") + @get:JsonProperty("name", required = true) val name: kotlin.String, + + @Schema(example = "null", required = true, description = "") + @get:JsonProperty("photoUrls", required = true) val photoUrls: kotlin.collections.List, + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("category") val category: Category? = null, + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("tags") val tags: kotlin.collections.List? = null, + + @Schema(example = "null", description = "pet status in the store") + @Deprecated(message = "") + @get:JsonProperty("status") val status: Pet.Status? = null +) : Serializable { + + /** + * pet status in the store + * Values: available,pending,sold + */ + enum class Status(@get:JsonValue val value: kotlin.String) { + + available("available"), + pending("pending"), + sold("sold"); + + companion object { + @JvmStatic + @JsonCreator + fun forValue(value: kotlin.String): Status { + return values().firstOrNull{it -> it.value == value} + ?: throw IllegalArgumentException("Unexpected value '$value' for enum 'Pet'") + } + } + } + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Tag.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Tag.kt new file mode 100644 index 000000000000..9aeefda7ac75 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/Tag.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A tag for a pet + * @param id + * @param name + */ +data class Tag( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("name") val name: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/User.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/User.kt new file mode 100644 index 000000000000..3824ce08a5b2 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2-interface-only/src/main/kotlin/org/openapitools/model/User.kt @@ -0,0 +1,60 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A User who is purchasing from the pet store + * @param id + * @param username + * @param firstName + * @param lastName + * @param email + * @param password + * @param phone + * @param userStatus User Status + */ +data class User( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("username") val username: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("firstName") val firstName: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("lastName") val lastName: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("email") val email: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("password") val password: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("phone") val phone: kotlin.String? = null, + + @Schema(example = "null", description = "User Status") + @get:JsonProperty("userStatus") val userStatus: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator-ignore b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator-ignore new file mode 100644 index 000000000000..7484ee590a38 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/FILES new file mode 100644 index 000000000000..8ba65087e770 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/FILES @@ -0,0 +1,36 @@ +README.md +build.gradle.kts +gradle/wrapper/gradle-wrapper.jar +gradle/wrapper/gradle-wrapper.properties +gradlew +gradlew.bat +pom.xml +settings.gradle +src/main/kotlin/org/openapitools/Application.kt +src/main/kotlin/org/openapitools/HomeController.kt +src/main/kotlin/org/openapitools/SpringDocConfiguration.kt +src/main/kotlin/org/openapitools/api/ApiUtil.kt +src/main/kotlin/org/openapitools/api/Exceptions.kt +src/main/kotlin/org/openapitools/api/ItemsApiController.kt +src/main/kotlin/org/openapitools/api/ItemsApiService.kt +src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt +src/main/kotlin/org/openapitools/api/PetApiController.kt +src/main/kotlin/org/openapitools/api/PetApiService.kt +src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt +src/main/kotlin/org/openapitools/api/StoreApiController.kt +src/main/kotlin/org/openapitools/api/StoreApiService.kt +src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt +src/main/kotlin/org/openapitools/api/UserApiController.kt +src/main/kotlin/org/openapitools/api/UserApiService.kt +src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt +src/main/kotlin/org/openapitools/model/Category.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt +src/main/kotlin/org/openapitools/model/ModelApiResponse.kt +src/main/kotlin/org/openapitools/model/Order.kt +src/main/kotlin/org/openapitools/model/Pet.kt +src/main/kotlin/org/openapitools/model/Tag.kt +src/main/kotlin/org/openapitools/model/User.kt +src/main/resources/application.yaml +src/main/resources/openapi.yaml diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/VERSION b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/VERSION new file mode 100644 index 000000000000..2fb556b60635 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.18.0-SNAPSHOT diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/README.md b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/README.md new file mode 100644 index 000000000000..b6865a081135 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/README.md @@ -0,0 +1,21 @@ +# openAPIPetstore + +This Kotlin based [Spring Boot](https://spring.io/projects/spring-boot) application has been generated using the [OpenAPI Generator](https://github.com/OpenAPITools/openapi-generator). + +## Getting Started + +This document assumes you have either maven or gradle available, either via the wrapper or otherwise. This does not come with a gradle / maven wrapper checked in. + +By default a [`pom.xml`](pom.xml) file will be generated. If you specified `gradleBuildFile=true` when generating this project, a `build.gradle.kts` will also be generated. Note this uses [Gradle Kotlin DSL](https://github.com/gradle/kotlin-dsl). + +To build the project using maven, run: +```bash +mvn package && java -jar target/openapi-spring-1.0.0.jar +``` + +To build the project using gradle, run: +```bash +gradle build && java -jar build/libs/openapi-spring-1.0.0.jar +``` + +If all builds successfully, the server should run on [http://localhost:8080/](http://localhost:8080/) diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/build.gradle.kts b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/build.gradle.kts new file mode 100644 index 000000000000..ae1b59ef90c8 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/build.gradle.kts @@ -0,0 +1,43 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +group = "org.openapitools" +version = "1.0.0" +java.sourceCompatibility = JavaVersion.VERSION_17 + +repositories { + mavenCentral() + maven { url = uri("https://repo.spring.io/milestone") } +} + +tasks.withType { + kotlinOptions.jvmTarget = "17" +} + +plugins { + val kotlinVersion = "1.9.25" + id("org.jetbrains.kotlin.jvm") version kotlinVersion + id("org.jetbrains.kotlin.plugin.jpa") version kotlinVersion + id("org.jetbrains.kotlin.plugin.spring") version kotlinVersion + id("org.springframework.boot") version "3.0.2" + id("io.spring.dependency-management") version "1.0.14.RELEASE" +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springdoc:springdoc-openapi-starter-webmvc-api:2.6.0") + + implementation("com.google.code.findbugs:jsr305:3.0.2") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + implementation("jakarta.validation:jakarta.validation-api") + implementation("jakarta.annotation:jakarta.annotation-api:2.1.0") + + testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") + testImplementation("org.springframework.boot:spring-boot-starter-test") { + exclude(module = "junit") + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradle/wrapper/gradle-wrapper.jar b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000000..e6441136f3d4 Binary files /dev/null and b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradle/wrapper/gradle-wrapper.jar differ diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradle/wrapper/gradle-wrapper.properties b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..80187ac30432 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradlew b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradlew new file mode 100644 index 000000000000..9d0ce634cb11 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while +APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path +[ -h "$app_path" ] +do +ls=$( ls -ld "$app_path" ) +link=${ls#*' -> '} +case $link in #( +/*) app_path=$link ;; #( +*) app_path=$APP_HOME$link ;; +esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { +echo "$*" +} >&2 + +die () { +echo +echo "$*" +echo +exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( +CYGWIN* ) cygwin=true ;; #( +Darwin* ) darwin=true ;; #( +MSYS* | MINGW* ) msys=true ;; #( +NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then +if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +# IBM's JDK on AIX uses strange locations for the executables +JAVACMD=$JAVA_HOME/jre/sh/java +else +JAVACMD=$JAVA_HOME/bin/java +fi +if [ ! -x "$JAVACMD" ] ; then +die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +else +JAVACMD=java +if ! command -v java >/dev/null 2>&1 +then +die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then +case $MAX_FD in #( +max*) +# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +MAX_FD=$( ulimit -H -n ) || +warn "Could not query maximum file descriptor limit" +esac +case $MAX_FD in #( +'' | soft) :;; #( +*) +# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +ulimit -n "$MAX_FD" || +warn "Could not set maximum file descriptor limit to $MAX_FD" +esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then +APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) +CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + +JAVACMD=$( cygpath --unix "$JAVACMD" ) + +# Now convert the arguments - kludge to limit ourselves to /bin/sh +for arg do +if +case $arg in #( +-*) false ;; # don't mess with options #( +/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath +[ -e "$t" ] ;; #( +*) false ;; +esac +then +arg=$( cygpath --path --ignore --mixed "$arg" ) +fi +# Roll the args list around exactly as many times as the number of +# args, so each arg winds up back in the position where it started, but +# possibly modified. +# +# NB: a `for` loop captures its iteration list before it begins, so +# changing the positional parameters here affects neither the number of +# iterations, nor the values presented in `arg`. +shift # remove old arg +set -- "$@" "$arg" # push replacement arg +done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ +"-Dorg.gradle.appname=$APP_BASE_NAME" \ +-classpath "$CLASSPATH" \ +org.gradle.wrapper.GradleWrapperMain \ +"$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then +die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( +printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | +xargs -n1 | +sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | +tr '\n' ' ' +)" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradlew.bat b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradlew.bat new file mode 100644 index 000000000000..25da30dbdeee --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/pom.xml b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/pom.xml new file mode 100644 index 000000000000..07c653febb4b --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/pom.xml @@ -0,0 +1,149 @@ + + 4.0.0 + org.openapitools + openapi-spring + jar + openapi-spring + 1.0.0 + + 3.0.2 + 2.1.0 + 1.7.10 + + 1.7.10 + UTF-8 + + + org.springframework.boot + spring-boot-starter-parent + 3.1.3 + + + + repository.spring.milestone + Spring Milestone Repository + https://repo.spring.io/milestone + + + + + spring-milestones + https://repo.spring.io/milestone + + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin.version} + + + spring + + 17 + + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springdoc + springdoc-openapi-webmvc-core + ${springdoc-openapi.version} + + + + + com.google.code.findbugs + jsr305 + ${findbugs-jsr305.version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + com.fasterxml.jackson.module + jackson-module-kotlin + + + + jakarta.validation + jakarta.validation-api + + + jakarta.annotation + jakarta.annotation-api + ${jakarta-annotation.version} + provided + + + org.jetbrains.kotlin + kotlin-test-junit5 + ${kotlin-test-junit5.version} + test + + + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/settings.gradle b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/settings.gradle new file mode 100644 index 000000000000..14844905cd40 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/settings.gradle @@ -0,0 +1,15 @@ +pluginManagement { + repositories { + maven { url = uri("https://repo.spring.io/snapshot") } + maven { url = uri("https://repo.spring.io/milestone") } + gradlePluginPortal() + } + resolutionStrategy { + eachPlugin { + if (requested.id.id == "org.springframework.boot") { + useModule("org.springframework.boot:spring-boot-gradle-plugin:${requested.version}") + } + } + } +} +rootProject.name = "openapi-spring" diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/Application.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/Application.kt new file mode 100644 index 000000000000..2fe6de62479e --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/Application.kt @@ -0,0 +1,13 @@ +package org.openapitools + +import org.springframework.boot.runApplication +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.context.annotation.ComponentScan + +@SpringBootApplication +@ComponentScan(basePackages = ["org.openapitools", "org.openapitools.api", "org.openapitools.model"]) +class Application + +fun main(args: Array) { + runApplication(*args) +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/HomeController.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/HomeController.kt new file mode 100644 index 000000000000..310e7f4d62e3 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/HomeController.kt @@ -0,0 +1,12 @@ +package org.openapitools + +import org.springframework.context.annotation.Bean +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.RequestMapping + +/** + * Home redirection to OpenAPI api documentation + */ +@Controller +class HomeController { +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/SpringDocConfiguration.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/SpringDocConfiguration.kt new file mode 100644 index 000000000000..cbdc4ba437ca --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/SpringDocConfiguration.kt @@ -0,0 +1,42 @@ +package org.openapitools + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +import io.swagger.v3.oas.models.OpenAPI +import io.swagger.v3.oas.models.info.Info +import io.swagger.v3.oas.models.info.Contact +import io.swagger.v3.oas.models.info.License +import io.swagger.v3.oas.models.Components +import io.swagger.v3.oas.models.security.SecurityScheme + +@Configuration +class SpringDocConfiguration { + + @Bean + fun apiInfo(): OpenAPI { + return OpenAPI() + .info( + Info() + .title("OpenAPI Petstore") + .description("This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.") + .license( + License() + .name("Apache-2.0") + .url("http://www.apache.org/licenses/LICENSE-2.0.html") + ) + .version("1.0.0") + ) + .components( + Components() + .addSecuritySchemes("petstore_auth", SecurityScheme() + .type(SecurityScheme.Type.OAUTH2) + ) + .addSecuritySchemes("api_key", SecurityScheme() + .type(SecurityScheme.Type.APIKEY) + .`in`(SecurityScheme.In.HEADER) + .name("api_key") + ) + ) + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ApiUtil.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ApiUtil.kt new file mode 100644 index 000000000000..03344e13b474 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ApiUtil.kt @@ -0,0 +1,19 @@ +package org.openapitools.api + +import org.springframework.web.context.request.NativeWebRequest + +import jakarta.servlet.http.HttpServletResponse +import java.io.IOException + +object ApiUtil { + fun setExampleResponse(req: NativeWebRequest, contentType: String, example: String) { + try { + val res = req.getNativeResponse(HttpServletResponse::class.java) + res?.characterEncoding = "UTF-8" + res?.addHeader("Content-Type", contentType) + res?.writer?.print(example) + } catch (e: IOException) { + throw RuntimeException(e) + } + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/Exceptions.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/Exceptions.kt new file mode 100644 index 000000000000..1bd78f54576a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/Exceptions.kt @@ -0,0 +1,30 @@ +package org.openapitools.api + +import org.springframework.context.annotation.Configuration +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.ControllerAdvice +import org.springframework.web.bind.annotation.ExceptionHandler +import jakarta.servlet.http.HttpServletResponse +import jakarta.validation.ConstraintViolationException + +// TODO Extend ApiException for custom exception handling, e.g. the below NotFound exception +sealed class ApiException(msg: String, val code: Int) : Exception(msg) + +class NotFoundException(msg: String, code: Int = HttpStatus.NOT_FOUND.value()) : ApiException(msg, code) + +@Configuration("org.openapitools.api.DefaultExceptionHandler") +@ControllerAdvice +class DefaultExceptionHandler { + + @ExceptionHandler(value = [ApiException::class]) + fun onApiException(ex: ApiException, response: HttpServletResponse): Unit = + response.sendError(ex.code, ex.message) + + @ExceptionHandler(value = [NotImplementedError::class]) + fun onNotImplemented(ex: NotImplementedError, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.NOT_IMPLEMENTED.value()) + + @ExceptionHandler(value = [ConstraintViolationException::class]) + fun onConstraintViolation(ex: ConstraintViolationException, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.BAD_REQUEST.value(), ex.constraintViolations.joinToString(", ") { it.message }) +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiController.kt new file mode 100644 index 000000000000..2d2f6caffc94 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -0,0 +1,87 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import jakarta.validation.Valid +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +class ItemsApiController(@Autowired(required = true) val service: ItemsApiService) { + + @Operation( + summary = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + operationId = "itemsItemIdSomethingItemSubIdGet", + description = """SQ = "; SBS = \; DBS = \\; SD = ${'$'}some""", + responses = [ + ApiResponse(responseCode = "200", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", content = [Content(schema = Schema(implementation = ItemsItemIdSomethingItemSubIdGet200Response::class))]) ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item$Id}/something/{item$SubId}" */], + produces = ["application/json"] + ) + fun itemsItemIdSomethingItemSubIdGet( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.itemsItemIdSomethingItemSubIdGet(itemDollarId, itemDollarSubId, filterDollarType, filterDollarSubType, xCustomHeader, xCustomHeaderTwo, sessionDollarToken, sessionDollarTokenTwo), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + operationId = "itemsPost", + description = """SQ = "; SBS = \; DBS = \\; SD = ${'$'}some""", + responses = [ + ApiResponse(responseCode = "201", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", content = [Content(schema = Schema(implementation = ItemWithDollarAttributesAndExamples::class))]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ITEMS_POST /* "/items" */], + produces = ["application/json"], + consumes = ["application/x-www-form-urlencoded"] + ) + fun itemsPost( + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", `in` = ParameterIn.HEADER) @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @Parameter(description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", schema = Schema(defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some")) @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.itemsPost(xPostHeader, formDollarName, formDollarValue), HttpStatus.valueOf(201)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiService.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiService.kt new file mode 100644 index 000000000000..918cb1610b33 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiService.kt @@ -0,0 +1,36 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response + +interface ItemsApiService { + + /** + * GET /items/{item$Id}/something/{item$SubId} : SQ = "; SBS = \; DBS = \\; SD = $some + * SQ = "; SBS = \; DBS = \\; SD = $some + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some (required) + * @param itemDollarSubId SQ = "; SBS = \; DBS = \\; SD = $some (required) + * @param filterDollarType SQ = "; SBS = \; DBS = \\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + * @param filterDollarSubType SQ = "; SBS = \; DBS = \\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + * @param xCustomHeader SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param xCustomHeaderTwo SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param sessionDollarToken SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param sessionDollarTokenTwo SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @return SQ = "; SBS = \; DBS = \\; SD = $some (status code 200) + * @see ItemsApi#itemsItemIdSomethingItemSubIdGet + */ + fun itemsItemIdSomethingItemSubIdGet(itemDollarId: kotlin.String, itemDollarSubId: kotlin.String, filterDollarType: kotlin.String, filterDollarSubType: kotlin.String, xCustomHeader: kotlin.String?, xCustomHeaderTwo: kotlin.String?, sessionDollarToken: kotlin.String?, sessionDollarTokenTwo: kotlin.String?): ItemsItemIdSomethingItemSubIdGet200Response + + /** + * POST /items : SQ = "; SBS = \; DBS = \\; SD = $some + * SQ = "; SBS = \; DBS = \\; SD = $some + * + * @param xPostHeader SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param formDollarName SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) + * @param formDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + * @return SQ = "; SBS = \; DBS = \\; SD = $some (status code 201) + * @see ItemsApi#itemsPost + */ + fun itemsPost(xPostHeader: kotlin.String?, formDollarName: kotlin.String?, formDollarValue: kotlin.String): ItemWithDollarAttributesAndExamples +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt new file mode 100644 index 000000000000..5753996f7855 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt @@ -0,0 +1,16 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import org.springframework.stereotype.Service +@Service +class ItemsApiServiceImpl : ItemsApiService { + + override fun itemsItemIdSomethingItemSubIdGet(itemDollarId: kotlin.String, itemDollarSubId: kotlin.String, filterDollarType: kotlin.String, filterDollarSubType: kotlin.String, xCustomHeader: kotlin.String?, xCustomHeaderTwo: kotlin.String?, sessionDollarToken: kotlin.String?, sessionDollarTokenTwo: kotlin.String?): ItemsItemIdSomethingItemSubIdGet200Response { + TODO("Implement me") + } + + override fun itemsPost(xPostHeader: kotlin.String?, formDollarName: kotlin.String?, formDollarValue: kotlin.String): ItemWithDollarAttributesAndExamples { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiController.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiController.kt new file mode 100644 index 000000000000..526c57dfd17b --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiController.kt @@ -0,0 +1,253 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import jakarta.validation.Valid +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +class PetApiController(@Autowired(required = true) val service: PetApiService) { + + @Operation( + summary = "Add a new pet to the store", + operationId = "addPet", + description = """""", + responses = [ + ApiResponse(responseCode = "405", description = "Invalid input") ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ADD_PET /* "/pet" */], + consumes = ["application/json", "application/xml"] + ) + fun addPet( + @Parameter(description = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody body: Pet + ): ResponseEntity { + return ResponseEntity(service.addPet(body), HttpStatus.valueOf(405)) + } + + @Operation( + summary = "Deletes a pet", + operationId = "deletePet", + description = """""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid pet value") ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_PET /* "/pet/{petId}" */] + ) + fun deletePet( + @Parameter(description = "Pet id to delete", required = true) @PathVariable("petId") petId: kotlin.Long, + @Parameter(description = "", `in` = ParameterIn.HEADER) @RequestHeader(value = "api_key", required = false) apiKey: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.deletePet(petId, apiKey), HttpStatus.valueOf(400)) + } + + @Operation( + summary = "Finds Pets by status", + operationId = "findPetsByStatus", + description = """Multiple status values can be provided with comma separated strings""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(array = ArraySchema(schema = Schema(implementation = Pet::class)))]), + ApiResponse(responseCode = "400", description = "Invalid status value") ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_FIND_PETS_BY_STATUS /* "/pet/findByStatus" */], + produces = ["application/xml", "application/json"] + ) + fun findPetsByStatus( + @NotNull @Parameter(description = "Status values that need to be considered for filter", required = true, schema = Schema(allowableValues = ["available", "pending", "sold"])) @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List + ): ResponseEntity> { + return ResponseEntity(service.findPetsByStatus(status), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Finds Pets by tags", + operationId = "findPetsByTags", + description = """Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(array = ArraySchema(schema = Schema(implementation = Pet::class)))]), + ApiResponse(responseCode = "400", description = "Invalid tag value") ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_FIND_PETS_BY_TAGS /* "/pet/findByTags" */], + produces = ["application/xml", "application/json"] + ) + fun findPetsByTags( + @NotNull @Parameter(description = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List + ): ResponseEntity> { + return ResponseEntity(service.findPetsByTags(tags), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Get an image", + operationId = "getImage", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = org.springframework.core.io.Resource::class))]) ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_IMAGE /* "/pet/{petId}/getImage" */], + produces = ["application/octet-stream"] + ) + fun getImage( + @Parameter(description = "ID of pet to get image", required = true) @PathVariable("petId") petId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(service.getImage(petId), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Find pet by ID", + operationId = "getPetById", + description = """Returns a single pet""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Pet::class))]), + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Pet not found") ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_PET_BY_ID /* "/pet/{petId}" */], + produces = ["application/xml", "application/json"] + ) + fun getPetById( + @Parameter(description = "ID of pet to return", required = true) @PathVariable("petId") petId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(service.getPetById(petId), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Update an existing pet", + operationId = "updatePet", + description = """""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Pet not found"), + ApiResponse(responseCode = "405", description = "Validation exception") ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.PUT], + value = [PATH_UPDATE_PET /* "/pet" */], + consumes = ["application/json", "application/xml"] + ) + fun updatePet( + @Parameter(description = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody body: Pet + ): ResponseEntity { + return ResponseEntity(service.updatePet(body), HttpStatus.valueOf(400)) + } + + @Operation( + summary = "Updates a pet in the store with form data", + operationId = "updatePetWithForm", + description = """""", + responses = [ + ApiResponse(responseCode = "405", description = "Invalid input") ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPDATE_PET_WITH_FORM /* "/pet/{petId}" */], + consumes = ["application/x-www-form-urlencoded"] + ) + fun updatePetWithForm( + @Parameter(description = "ID of pet that needs to be updated", required = true) @PathVariable("petId") petId: kotlin.Long, + @Parameter(description = "Updated name of the pet") @Valid @RequestParam(value = "name", required = false) name: kotlin.String?, + @Parameter(description = "Updated status of the pet") @Valid @RequestParam(value = "status", required = false) status: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.updatePetWithForm(petId, name, status), HttpStatus.valueOf(405)) + } + + @Operation( + summary = "uploads an image", + operationId = "uploadFile", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = ModelApiResponse::class))]) ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPLOAD_FILE /* "/pet/{petId}/uploadImage" */], + produces = ["application/json"], + consumes = ["multipart/form-data"] + ) + fun uploadFile( + @Parameter(description = "ID of pet to update", required = true) @PathVariable("petId") petId: kotlin.Long, + @Parameter(description = "image to upload") @Valid @RequestPart("image", required = true) image: org.springframework.web.multipart.MultipartFile, + @Parameter(description = "Additional data to pass to server") @Valid @RequestParam(value = "additionalMetadata", required = false) additionalMetadata: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.uploadFile(petId, image, additionalMetadata), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "uploads multiple images", + operationId = "uploadMultipleFile", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = ModelApiResponse::class))]) ], + security = [ SecurityRequirement(name = "petstore_auth", scopes = [ "write:pets", "read:pets" ]) ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPLOAD_MULTIPLE_FILE /* "/pet/{petId}/uploadMultipleImage" */], + produces = ["application/json"], + consumes = ["multipart/form-data"] + ) + fun uploadMultipleFile( + @Parameter(description = "ID of pet to update", required = true) @PathVariable("petId") petId: kotlin.Long, + @Parameter(description = "") @Valid @RequestPart("images", required = true) images: Array, + @Parameter(description = "Additional data to pass to server") @Valid @RequestParam(value = "additionalMetadata", required = false) additionalMetadata: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.uploadMultipleFile(petId, images, additionalMetadata), HttpStatus.valueOf(200)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ADD_PET: String = "/pet" + const val PATH_DELETE_PET: String = "/pet/{petId}" + const val PATH_FIND_PETS_BY_STATUS: String = "/pet/findByStatus" + const val PATH_FIND_PETS_BY_TAGS: String = "/pet/findByTags" + const val PATH_GET_IMAGE: String = "/pet/{petId}/getImage" + const val PATH_GET_PET_BY_ID: String = "/pet/{petId}" + const val PATH_UPDATE_PET: String = "/pet" + const val PATH_UPDATE_PET_WITH_FORM: String = "/pet/{petId}" + const val PATH_UPLOAD_FILE: String = "/pet/{petId}/uploadImage" + const val PATH_UPLOAD_MULTIPLE_FILE: String = "/pet/{petId}/uploadMultipleImage" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiService.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiService.kt new file mode 100644 index 000000000000..fe00af396a96 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiService.kt @@ -0,0 +1,114 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet + +interface PetApiService { + + /** + * POST /pet : Add a new pet to the store + * + * @param body Pet object that needs to be added to the store (required) + * @return Invalid input (status code 405) + * @see PetApi#addPet + */ + fun addPet(body: Pet): Unit + + /** + * DELETE /pet/{petId} : Deletes a pet + * + * @param petId Pet id to delete (required) + * @param apiKey (optional) + * @return Invalid pet value (status code 400) + * @see PetApi#deletePet + */ + fun deletePet(petId: kotlin.Long, apiKey: kotlin.String?): Unit + + /** + * GET /pet/findByStatus : Finds Pets by status + * Multiple status values can be provided with comma separated strings + * + * @param status Status values that need to be considered for filter (required) + * @return successful operation (status code 200) + * or Invalid status value (status code 400) + * @see PetApi#findPetsByStatus + */ + fun findPetsByStatus(status: kotlin.collections.List): List + + /** + * GET /pet/findByTags : Finds Pets by tags + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + * + * @param tags Tags to filter by (required) + * @return successful operation (status code 200) + * or Invalid tag value (status code 400) + * @deprecated + * @see PetApi#findPetsByTags + */ + fun findPetsByTags(tags: kotlin.collections.List): List + + /** + * GET /pet/{petId}/getImage : Get an image + * + * @param petId ID of pet to get image (required) + * @return successful operation (status code 200) + * @see PetApi#getImage + */ + fun getImage(petId: kotlin.Long): org.springframework.core.io.Resource + + /** + * GET /pet/{petId} : Find pet by ID + * Returns a single pet + * + * @param petId ID of pet to return (required) + * @return successful operation (status code 200) + * or Invalid ID supplied (status code 400) + * or Pet not found (status code 404) + * @see PetApi#getPetById + */ + fun getPetById(petId: kotlin.Long): Pet + + /** + * PUT /pet : Update an existing pet + * + * @param body Pet object that needs to be added to the store (required) + * @return Invalid ID supplied (status code 400) + * or Pet not found (status code 404) + * or Validation exception (status code 405) + * @see PetApi#updatePet + */ + fun updatePet(body: Pet): Unit + + /** + * POST /pet/{petId} : Updates a pet in the store with form data + * + * @param petId ID of pet that needs to be updated (required) + * @param name Updated name of the pet (optional) + * @param status Updated status of the pet (optional) + * @return Invalid input (status code 405) + * @see PetApi#updatePetWithForm + */ + fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?): Unit + + /** + * POST /pet/{petId}/uploadImage : uploads an image + * + * @param petId ID of pet to update (required) + * @param image image to upload (required) + * @param additionalMetadata Additional data to pass to server (optional) + * @return successful operation (status code 200) + * @see PetApi#uploadFile + */ + fun uploadFile(petId: kotlin.Long, image: org.springframework.web.multipart.MultipartFile, additionalMetadata: kotlin.String?): ModelApiResponse + + /** + * POST /pet/{petId}/uploadMultipleImage : uploads multiple images + * + * @param petId ID of pet to update (required) + * @param images (required) + * @param additionalMetadata Additional data to pass to server (optional) + * @return successful operation (status code 200) + * @see PetApi#uploadMultipleFile + */ + fun uploadMultipleFile(petId: kotlin.Long, images: Array, additionalMetadata: kotlin.String?): ModelApiResponse +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt new file mode 100644 index 000000000000..5b1b8e57d8be --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt @@ -0,0 +1,48 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import org.springframework.stereotype.Service +@Service +class PetApiServiceImpl : PetApiService { + + override fun addPet(body: Pet): Unit { + TODO("Implement me") + } + + override fun deletePet(petId: kotlin.Long, apiKey: kotlin.String?): Unit { + TODO("Implement me") + } + + override fun findPetsByStatus(status: kotlin.collections.List): List { + TODO("Implement me") + } + + override fun findPetsByTags(tags: kotlin.collections.List): List { + TODO("Implement me") + } + + override fun getImage(petId: kotlin.Long): org.springframework.core.io.Resource { + TODO("Implement me") + } + + override fun getPetById(petId: kotlin.Long): Pet { + TODO("Implement me") + } + + override fun updatePet(body: Pet): Unit { + TODO("Implement me") + } + + override fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?): Unit { + TODO("Implement me") + } + + override fun uploadFile(petId: kotlin.Long, image: org.springframework.web.multipart.MultipartFile, additionalMetadata: kotlin.String?): ModelApiResponse { + TODO("Implement me") + } + + override fun uploadMultipleFile(petId: kotlin.Long, images: Array, additionalMetadata: kotlin.String?): ModelApiResponse { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiController.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiController.kt new file mode 100644 index 000000000000..cbb6a7f5c6a0 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiController.kt @@ -0,0 +1,116 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import jakarta.validation.Valid +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +class StoreApiController(@Autowired(required = true) val service: StoreApiService) { + + @Operation( + summary = "Delete purchase order by ID", + operationId = "deleteOrder", + description = """For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Order not found") ] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_ORDER /* "/store/order/{orderId}" */] + ) + fun deleteOrder( + @Parameter(description = "ID of the order that needs to be deleted", required = true) @PathVariable("orderId") orderId: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.deleteOrder(orderId), HttpStatus.valueOf(400)) + } + + @Operation( + summary = "Returns pet inventories by status", + operationId = "getInventory", + description = """Returns a map of status codes to quantities""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = kotlin.collections.Map::class))]) ], + security = [ SecurityRequirement(name = "api_key") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_INVENTORY /* "/store/inventory" */], + produces = ["application/json"] + ) + fun getInventory(): ResponseEntity> { + return ResponseEntity(service.getInventory(), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Find purchase order by ID", + operationId = "getOrderById", + description = """For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Order::class))]), + ApiResponse(responseCode = "400", description = "Invalid ID supplied"), + ApiResponse(responseCode = "404", description = "Order not found") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_ORDER_BY_ID /* "/store/order/{orderId}" */], + produces = ["application/xml", "application/json"] + ) + fun getOrderById( + @Min(value=1L) @Max(value=5L) @Parameter(description = "ID of pet that needs to be fetched", required = true) @PathVariable("orderId") orderId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(service.getOrderById(orderId), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Place an order for a pet", + operationId = "placeOrder", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = Order::class))]), + ApiResponse(responseCode = "400", description = "Invalid Order") ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_PLACE_ORDER /* "/store/order" */], + produces = ["application/xml", "application/json"] + ) + fun placeOrder( + @Parameter(description = "order placed for purchasing the pet", required = true) @Valid @RequestBody body: Order + ): ResponseEntity { + return ResponseEntity(service.placeOrder(body), HttpStatus.valueOf(200)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_DELETE_ORDER: String = "/store/order/{orderId}" + const val PATH_GET_INVENTORY: String = "/store/inventory" + const val PATH_GET_ORDER_BY_ID: String = "/store/order/{orderId}" + const val PATH_PLACE_ORDER: String = "/store/order" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt new file mode 100644 index 000000000000..c65ddf31c90a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -0,0 +1,48 @@ +package org.openapitools.api + +import org.openapitools.model.Order + +interface StoreApiService { + + /** + * DELETE /store/order/{orderId} : Delete purchase order by ID + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * + * @param orderId ID of the order that needs to be deleted (required) + * @return Invalid ID supplied (status code 400) + * or Order not found (status code 404) + * @see StoreApi#deleteOrder + */ + fun deleteOrder(orderId: kotlin.String): Unit + + /** + * GET /store/inventory : Returns pet inventories by status + * Returns a map of status codes to quantities + * + * @return successful operation (status code 200) + * @see StoreApi#getInventory + */ + fun getInventory(): Map + + /** + * GET /store/order/{orderId} : Find purchase order by ID + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * + * @param orderId ID of pet that needs to be fetched (required) + * @return successful operation (status code 200) + * or Invalid ID supplied (status code 400) + * or Order not found (status code 404) + * @see StoreApi#getOrderById + */ + fun getOrderById(orderId: kotlin.Long): Order + + /** + * POST /store/order : Place an order for a pet + * + * @param body order placed for purchasing the pet (required) + * @return successful operation (status code 200) + * or Invalid Order (status code 400) + * @see StoreApi#placeOrder + */ + fun placeOrder(body: Order): Order +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt new file mode 100644 index 000000000000..7e733e28dc50 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt @@ -0,0 +1,23 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import org.springframework.stereotype.Service +@Service +class StoreApiServiceImpl : StoreApiService { + + override fun deleteOrder(orderId: kotlin.String): Unit { + TODO("Implement me") + } + + override fun getInventory(): Map { + TODO("Implement me") + } + + override fun getOrderById(orderId: kotlin.Long): Order { + TODO("Implement me") + } + + override fun placeOrder(body: Order): Order { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiController.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiController.kt new file mode 100644 index 000000000000..91970e252573 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiController.kt @@ -0,0 +1,205 @@ +package org.openapitools.api + +import org.openapitools.model.User +import io.swagger.v3.oas.annotations.* +import io.swagger.v3.oas.annotations.enums.* +import io.swagger.v3.oas.annotations.media.* +import io.swagger.v3.oas.annotations.responses.* +import io.swagger.v3.oas.annotations.security.* +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import jakarta.validation.Valid +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +class UserApiController(@Autowired(required = true) val service: UserApiService) { + + @Operation( + summary = "Create user", + operationId = "createUser", + description = """This can only be done by the logged in user.""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USER /* "/user" */] + ) + fun createUser( + @Parameter(description = "Created user object", required = true) @Valid @RequestBody body: User + ): ResponseEntity { + return ResponseEntity(service.createUser(body), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Creates list of users with given input array", + operationId = "createUsersWithArrayInput", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USERS_WITH_ARRAY_INPUT /* "/user/createWithArray" */] + ) + fun createUsersWithArrayInput( + @Parameter(description = "List of user object", required = true) @Valid @RequestBody body: kotlin.collections.List + ): ResponseEntity { + return ResponseEntity(service.createUsersWithArrayInput(body), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Creates list of users with given input array", + operationId = "createUsersWithListInput", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") ] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USERS_WITH_LIST_INPUT /* "/user/createWithList" */] + ) + fun createUsersWithListInput( + @Parameter(description = "List of user object", required = true) @Valid @RequestBody body: kotlin.collections.List + ): ResponseEntity { + return ResponseEntity(service.createUsersWithListInput(body), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Delete user", + operationId = "deleteUser", + description = """This can only be done by the logged in user.""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid username supplied"), + ApiResponse(responseCode = "404", description = "User not found") ] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_USER /* "/user/{username}" */] + ) + fun deleteUser( + @Parameter(description = "The name that needs to be deleted", required = true) @PathVariable("username") username: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.deleteUser(username), HttpStatus.valueOf(400)) + } + + @Operation( + summary = "Get user by user name", + operationId = "getUserByName", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = User::class))]), + ApiResponse(responseCode = "400", description = "Invalid username supplied"), + ApiResponse(responseCode = "404", description = "User not found") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_USER_BY_NAME /* "/user/{username}" */], + produces = ["application/xml", "application/json"] + ) + fun getUserByName( + @Parameter(description = "The name that needs to be fetched. Use user1 for testing.", required = true) @PathVariable("username") username: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.getUserByName(username), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Logs user into the system", + operationId = "loginUser", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation", content = [Content(schema = Schema(implementation = kotlin.String::class))]), + ApiResponse(responseCode = "400", description = "Invalid username/password supplied") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_LOGIN_USER /* "/user/login" */], + produces = ["application/xml", "application/json"] + ) + fun loginUser( + @NotNull @Parameter(description = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) username: kotlin.String, + @NotNull @Parameter(description = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) password: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.loginUser(username, password), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Logs out current logged in user session", + operationId = "logoutUser", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "successful operation") ] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_LOGOUT_USER /* "/user/logout" */] + ) + fun logoutUser(): ResponseEntity { + return ResponseEntity(service.logoutUser(), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "logoutUserOptions", + operationId = "logoutUserOptions", + description = """""", + responses = [ + ApiResponse(responseCode = "200", description = "endpoint configuration response") ] + ) + @RequestMapping( + method = [RequestMethod.OPTIONS], + value = [PATH_LOGOUT_USER_OPTIONS /* "/user/logout" */] + ) + fun logoutUserOptions(): ResponseEntity { + return ResponseEntity(service.logoutUserOptions(), HttpStatus.valueOf(200)) + } + + @Operation( + summary = "Updated user", + operationId = "updateUser", + description = """This can only be done by the logged in user.""", + responses = [ + ApiResponse(responseCode = "400", description = "Invalid user supplied"), + ApiResponse(responseCode = "404", description = "User not found") ] + ) + @RequestMapping( + method = [RequestMethod.PUT], + value = [PATH_UPDATE_USER /* "/user/{username}" */] + ) + fun updateUser( + @Parameter(description = "name that need to be deleted", required = true) @PathVariable("username") username: kotlin.String, + @Parameter(description = "Updated user object", required = true) @Valid @RequestBody body: User + ): ResponseEntity { + return ResponseEntity(service.updateUser(username, body), HttpStatus.valueOf(400)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_CREATE_USER: String = "/user" + const val PATH_CREATE_USERS_WITH_ARRAY_INPUT: String = "/user/createWithArray" + const val PATH_CREATE_USERS_WITH_LIST_INPUT: String = "/user/createWithList" + const val PATH_DELETE_USER: String = "/user/{username}" + const val PATH_GET_USER_BY_NAME: String = "/user/{username}" + const val PATH_LOGIN_USER: String = "/user/login" + const val PATH_LOGOUT_USER: String = "/user/logout" + const val PATH_LOGOUT_USER_OPTIONS: String = "/user/logout" + const val PATH_UPDATE_USER: String = "/user/{username}" + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiService.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiService.kt new file mode 100644 index 000000000000..6942dc3ede0a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiService.kt @@ -0,0 +1,95 @@ +package org.openapitools.api + +import org.openapitools.model.User + +interface UserApiService { + + /** + * POST /user : Create user + * This can only be done by the logged in user. + * + * @param body Created user object (required) + * @return successful operation (status code 200) + * @see UserApi#createUser + */ + fun createUser(body: User): Unit + + /** + * POST /user/createWithArray : Creates list of users with given input array + * + * @param body List of user object (required) + * @return successful operation (status code 200) + * @see UserApi#createUsersWithArrayInput + */ + fun createUsersWithArrayInput(body: kotlin.collections.List): Unit + + /** + * POST /user/createWithList : Creates list of users with given input array + * + * @param body List of user object (required) + * @return successful operation (status code 200) + * @see UserApi#createUsersWithListInput + */ + fun createUsersWithListInput(body: kotlin.collections.List): Unit + + /** + * DELETE /user/{username} : Delete user + * This can only be done by the logged in user. + * + * @param username The name that needs to be deleted (required) + * @return Invalid username supplied (status code 400) + * or User not found (status code 404) + * @see UserApi#deleteUser + */ + fun deleteUser(username: kotlin.String): Unit + + /** + * GET /user/{username} : Get user by user name + * + * @param username The name that needs to be fetched. Use user1 for testing. (required) + * @return successful operation (status code 200) + * or Invalid username supplied (status code 400) + * or User not found (status code 404) + * @see UserApi#getUserByName + */ + fun getUserByName(username: kotlin.String): User + + /** + * GET /user/login : Logs user into the system + * + * @param username The user name for login (required) + * @param password The password for login in clear text (required) + * @return successful operation (status code 200) + * or Invalid username/password supplied (status code 400) + * @see UserApi#loginUser + */ + fun loginUser(username: kotlin.String, password: kotlin.String): kotlin.String + + /** + * GET /user/logout : Logs out current logged in user session + * + * @return successful operation (status code 200) + * @see UserApi#logoutUser + */ + fun logoutUser(): Unit + + /** + * OPTIONS /user/logout : logoutUserOptions + * + * @return endpoint configuration response (status code 200) + * @see UserApi#logoutUserOptions + */ + fun logoutUserOptions(): Unit + + /** + * PUT /user/{username} : Updated user + * This can only be done by the logged in user. + * + * @param username name that need to be deleted (required) + * @param body Updated user object (required) + * @return Invalid user supplied (status code 400) + * or User not found (status code 404) + * @see UserApi#updateUser + */ + fun updateUser(username: kotlin.String, body: User): Unit +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt new file mode 100644 index 000000000000..f0798bd1695a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt @@ -0,0 +1,43 @@ +package org.openapitools.api + +import org.openapitools.model.User +import org.springframework.stereotype.Service +@Service +class UserApiServiceImpl : UserApiService { + + override fun createUser(body: User): Unit { + TODO("Implement me") + } + + override fun createUsersWithArrayInput(body: kotlin.collections.List): Unit { + TODO("Implement me") + } + + override fun createUsersWithListInput(body: kotlin.collections.List): Unit { + TODO("Implement me") + } + + override fun deleteUser(username: kotlin.String): Unit { + TODO("Implement me") + } + + override fun getUserByName(username: kotlin.String): User { + TODO("Implement me") + } + + override fun loginUser(username: kotlin.String, password: kotlin.String): kotlin.String { + TODO("Implement me") + } + + override fun logoutUser(): Unit { + TODO("Implement me") + } + + override fun logoutUserOptions(): Unit { + TODO("Implement me") + } + + override fun updateUser(username: kotlin.String, body: User): Unit { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Category.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Category.kt new file mode 100644 index 000000000000..4415f71fc6e3 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Category.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A category for a pet + * @param id + * @param name + */ +data class Category( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("name") val name: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..c72ad5e772ca --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..a892b615afa7 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..9a960bec6b6c --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @Schema(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @Schema(example = "42", description = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt new file mode 100644 index 000000000000..b94f16fe0c34 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt @@ -0,0 +1,40 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * Describes the result of uploading an image resource + * @param code + * @param type + * @param message + */ +data class ModelApiResponse( + + @Schema(example = "null", description = "") + @get:JsonProperty("code") val code: kotlin.Int? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("type") val type: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("message") val message: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Order.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Order.kt new file mode 100644 index 000000000000..f1f9dd136e4d --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Order.kt @@ -0,0 +1,74 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * An order for a pets from the pet store + * @param id + * @param petId + * @param quantity + * @param shipDate + * @param status Order Status + * @param complete + */ +data class Order( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("petId") val petId: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("quantity") val quantity: kotlin.Int? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("shipDate") val shipDate: java.time.OffsetDateTime? = null, + + @Schema(example = "null", description = "Order Status") + @get:JsonProperty("status") val status: Order.Status? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("complete") val complete: kotlin.Boolean? = false +) : Serializable { + + /** + * Order Status + * Values: placed,approved,delivered + */ + enum class Status(@get:JsonValue val value: kotlin.String) { + + placed("placed"), + approved("approved"), + delivered("delivered"); + + companion object { + @JvmStatic + @JsonCreator + fun forValue(value: kotlin.String): Status { + return values().firstOrNull{it -> it.value == value} + ?: throw IllegalArgumentException("Unexpected value '$value' for enum 'Order'") + } + } + } + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Pet.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Pet.kt new file mode 100644 index 000000000000..a96e73ae83cb --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Pet.kt @@ -0,0 +1,78 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import org.openapitools.model.Category +import org.openapitools.model.Tag +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A pet for sale in the pet store + * @param name + * @param photoUrls + * @param id + * @param category + * @param tags + * @param status pet status in the store + */ +data class Pet( + + @Schema(example = "doggie", required = true, description = "") + @get:JsonProperty("name", required = true) val name: kotlin.String, + + @Schema(example = "null", required = true, description = "") + @get:JsonProperty("photoUrls", required = true) val photoUrls: kotlin.collections.List, + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("category") val category: Category? = null, + + @field:Valid + @Schema(example = "null", description = "") + @get:JsonProperty("tags") val tags: kotlin.collections.List? = null, + + @Schema(example = "null", description = "pet status in the store") + @get:JsonProperty("status") val status: Pet.Status? = null +) : Serializable { + + /** + * pet status in the store + * Values: available,pending,sold + */ + enum class Status(@get:JsonValue val value: kotlin.String) { + + available("available"), + pending("pending"), + sold("sold"); + + companion object { + @JvmStatic + @JsonCreator + fun forValue(value: kotlin.String): Status { + return values().firstOrNull{it -> it.value == value} + ?: throw IllegalArgumentException("Unexpected value '$value' for enum 'Pet'") + } + } + } + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Tag.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Tag.kt new file mode 100644 index 000000000000..9aeefda7ac75 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/Tag.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A tag for a pet + * @param id + * @param name + */ +data class Tag( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("name") val name: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/User.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/User.kt new file mode 100644 index 000000000000..3824ce08a5b2 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/kotlin/org/openapitools/model/User.kt @@ -0,0 +1,60 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import jakarta.validation.constraints.DecimalMax +import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.Email +import jakarta.validation.constraints.Max +import jakarta.validation.constraints.Min +import jakarta.validation.constraints.NotNull +import jakarta.validation.constraints.Pattern +import jakarta.validation.constraints.Size +import jakarta.validation.Valid +import io.swagger.v3.oas.annotations.media.Schema + +/** + * A User who is purchasing from the pet store + * @param id + * @param username + * @param firstName + * @param lastName + * @param email + * @param password + * @param phone + * @param userStatus User Status + */ +data class User( + + @Schema(example = "null", description = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("username") val username: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("firstName") val firstName: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("lastName") val lastName: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("email") val email: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("password") val password: kotlin.String? = null, + + @Schema(example = "null", description = "") + @get:JsonProperty("phone") val phone: kotlin.String? = null, + + @Schema(example = "null", description = "User Status") + @get:JsonProperty("userStatus") val userStatus: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/resources/application.yaml b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/resources/application.yaml new file mode 100644 index 000000000000..8e2ebcde976d --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/resources/application.yaml @@ -0,0 +1,10 @@ +spring: + application: + name: openAPIPetstore + + jackson: + serialization: + WRITE_DATES_AS_TIMESTAMPS: false + +server: + port: 8080 diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/resources/openapi.yaml b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/resources/openapi.yaml new file mode 100644 index 000000000000..e06418a039f3 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/main/resources/openapi.yaml @@ -0,0 +1,1060 @@ +openapi: 3.0.1 +info: + description: "This is a sample server Petstore server. For this sample, you can\ + \ use the api key `special-key` to test the authorization filters." + license: + name: Apache-2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + title: OpenAPI Petstore + version: 1.0.0 +servers: +- url: http://petstore.swagger.io/v2 +tags: +- description: Everything about your Pets + name: pet +- description: Access to Petstore orders + name: store +- description: Operations about user + name: user +paths: + /pet: + post: + operationId: addPet + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Pet" + application/xml: + schema: + $ref: "#/components/schemas/Pet" + description: Pet object that needs to be added to the store + required: true + responses: + "405": + content: {} + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + summary: Add a new pet to the store + tags: + - pet tag + x-codegen-request-body-name: body + put: + operationId: updatePet + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Pet" + application/xml: + schema: + $ref: "#/components/schemas/Pet" + description: Pet object that needs to be added to the store + required: true + responses: + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Pet not found + "405": + content: {} + description: Validation exception + security: + - petstore_auth: + - write:pets + - read:pets + summary: Update an existing pet + tags: + - pet tag + x-codegen-request-body-name: body + /pet/findByStatus: + get: + description: Multiple status values can be provided with comma separated strings + operationId: findPetsByStatus + parameters: + - description: Status values that need to be considered for filter + explode: false + in: query + name: status + required: true + schema: + items: + default: available + enum: + - available + - pending + - sold + type: string + type: array + style: form + responses: + "200": + content: + application/xml: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + application/json: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + description: successful operation + "400": + content: {} + description: Invalid status value + security: + - petstore_auth: + - write:pets + - read:pets + summary: Finds Pets by status + tags: + - pet tag + x-spring-paginated: true + /pet/findByTags: + get: + deprecated: true + description: "Multiple tags can be provided with comma separated strings. Use\ + \ tag1, tag2, tag3 for testing." + operationId: findPetsByTags + parameters: + - description: Tags to filter by + explode: false + in: query + name: tags + required: true + schema: + items: + type: string + type: array + style: form + responses: + "200": + content: + application/xml: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + application/json: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + description: successful operation + "400": + content: {} + description: Invalid tag value + security: + - petstore_auth: + - write:pets + - read:pets + summary: Finds Pets by tags + tags: + - pet tag + x-spring-paginated: true + /pet/{petId}: + delete: + operationId: deletePet + parameters: + - explode: false + in: header + name: api_key + required: false + schema: + type: string + style: simple + - description: Pet id to delete + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + responses: + "400": + content: {} + description: Invalid pet value + security: + - petstore_auth: + - write:pets + - read:pets + summary: Deletes a pet + tags: + - pet tag + get: + description: Returns a single pet + operationId: getPetById + parameters: + - description: ID of pet to return + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Pet" + application/json: + schema: + $ref: "#/components/schemas/Pet" + description: successful operation + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Pet not found + security: + - api_key: [] + summary: Find pet by ID + tags: + - pet tag + post: + operationId: updatePetWithForm + parameters: + - description: ID of pet that needs to be updated + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/updatePetWithForm_request" + responses: + "405": + content: {} + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + summary: Updates a pet in the store with form data + tags: + - pet tag + /pet/{petId}/uploadImage: + post: + operationId: uploadFile + parameters: + - description: ID of pet to update + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + requestBody: + content: + multipart/form-data: + schema: + $ref: "#/components/schemas/uploadFile_request" + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/ApiResponse" + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: uploads an image + tags: + - pet tag + /pet/{petId}/uploadMultipleImage: + post: + operationId: uploadMultipleFile + parameters: + - description: ID of pet to update + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + requestBody: + content: + multipart/form-data: + schema: + $ref: "#/components/schemas/uploadMultipleFile_request" + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/ApiResponse" + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: uploads multiple images + tags: + - pet tag + /pet/{petId}/getImage: + get: + operationId: getImage + parameters: + - description: ID of pet to get image + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + responses: + "200": + content: + application/octet-stream: + schema: + format: binary + type: string + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: Get an image + tags: + - pet tag + /store/inventory: + get: + description: Returns a map of status codes to quantities + operationId: getInventory + responses: + "200": + content: + application/json: + schema: + additionalProperties: + format: int32 + type: integer + type: object + description: successful operation + security: + - api_key: [] + summary: Returns pet inventories by status + tags: + - store tag + /store/order: + post: + operationId: placeOrder + requestBody: + content: + '*/*': + schema: + $ref: "#/components/schemas/Order" + description: order placed for purchasing the pet + required: true + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Order" + application/json: + schema: + $ref: "#/components/schemas/Order" + description: successful operation + "400": + content: {} + description: Invalid Order + summary: Place an order for a pet + tags: + - store tag + x-codegen-request-body-name: body + /store/order/{orderId}: + delete: + description: For valid response try integer IDs with value < 1000. Anything + above 1000 or nonintegers will generate API errors + operationId: deleteOrder + parameters: + - description: ID of the order that needs to be deleted + explode: false + in: path + name: orderId + required: true + schema: + type: string + style: simple + responses: + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Order not found + summary: Delete purchase order by ID + tags: + - store tag + get: + description: For valid response try integer IDs with value <= 5 or > 10. Other + values will generate exceptions + operationId: getOrderById + parameters: + - description: ID of pet that needs to be fetched + explode: false + in: path + name: orderId + required: true + schema: + format: int64 + maximum: 5 + minimum: 1 + type: integer + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Order" + application/json: + schema: + $ref: "#/components/schemas/Order" + description: successful operation + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Order not found + summary: Find purchase order by ID + tags: + - store tag + /user: + post: + description: This can only be done by the logged in user. + operationId: createUser + requestBody: + content: + '*/*': + schema: + $ref: "#/components/schemas/User" + description: Created user object + required: true + responses: + default: + content: {} + description: successful operation + summary: Create user + tags: + - user tag + x-codegen-request-body-name: body + /user/createWithArray: + post: + operationId: createUsersWithArrayInput + requestBody: + content: + '*/*': + schema: + items: + $ref: "#/components/schemas/User" + type: array + description: List of user object + required: true + responses: + default: + content: {} + description: successful operation + summary: Creates list of users with given input array + tags: + - user tag + x-codegen-request-body-name: body + /user/createWithList: + post: + operationId: createUsersWithListInput + requestBody: + content: + '*/*': + schema: + items: + $ref: "#/components/schemas/User" + type: array + description: List of user object + required: true + responses: + default: + content: {} + description: successful operation + summary: Creates list of users with given input array + tags: + - user tag + x-codegen-request-body-name: body + /user/login: + get: + operationId: loginUser + parameters: + - description: The user name for login + explode: true + in: query + name: username + required: true + schema: + type: string + style: form + - description: The password for login in clear text + explode: true + in: query + name: password + required: true + schema: + type: string + style: form + responses: + "200": + content: + application/xml: + schema: + type: string + application/json: + schema: + type: string + description: successful operation + headers: + X-Rate-Limit: + description: calls per hour allowed by the user + explode: false + schema: + format: int32 + type: integer + style: simple + X-Expires-After: + description: date in UTC when token expires + explode: false + schema: + format: date-time + type: string + style: simple + "400": + content: {} + description: Invalid username/password supplied + summary: Logs user into the system + tags: + - user tag + /user/logout: + get: + operationId: logoutUser + responses: + default: + content: {} + description: successful operation + summary: Logs out current logged in user session + tags: + - user tag + options: + operationId: logoutUserOptions + responses: + default: + content: {} + description: endpoint configuration response + summary: logoutUserOptions + tags: + - user tag + /user/{username}: + delete: + description: This can only be done by the logged in user. + operationId: deleteUser + parameters: + - description: The name that needs to be deleted + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + responses: + "400": + content: {} + description: Invalid username supplied + "404": + content: {} + description: User not found + summary: Delete user + tags: + - user tag + get: + operationId: getUserByName + parameters: + - description: The name that needs to be fetched. Use user1 for testing. + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/User" + application/json: + schema: + $ref: "#/components/schemas/User" + description: successful operation + "400": + content: {} + description: Invalid username supplied + "404": + content: {} + description: User not found + summary: Get user by user name + tags: + - user tag + put: + description: This can only be done by the logged in user. + operationId: updateUser + parameters: + - description: name that need to be deleted + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + requestBody: + content: + '*/*': + schema: + $ref: "#/components/schemas/User" + description: Updated user object + required: true + responses: + "400": + content: {} + description: Invalid user supplied + "404": + content: {} + description: User not found + summary: Updated user + tags: + - user tag + x-codegen-request-body-name: body + /items/{item$Id}/something/{item$SubId}: + get: + description: SQ = "; SBS = \; DBS = \\; SD = $some + parameters: + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: path + name: item$Id + required: true + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: path + name: item$SubId + required: true + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: query + name: filter$Type + required: false + schema: + default: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: query + name: filter$SubType + required: false + schema: + default: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: header + name: X-Custom_Header + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: header + name: X-Custom_Header_two + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: cookie + name: session$Token + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: cookie + name: session$TokenTwo + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/_items__item_Id__something__item_SubId__get_200_response" + description: SQ = "; SBS = \; DBS = \\; SD = $some + summary: SQ = "; SBS = \; DBS = \\; SD = $some + /items: + post: + description: SQ = "; SBS = \; DBS = \\; SD = $some + parameters: + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: header + name: X-Post_Header + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/_items_post_request" + required: true + responses: + "201": + content: + application/json: + schema: + $ref: "#/components/schemas/ItemWithDollarAttributesAndExamples" + description: SQ = "; SBS = \; DBS = \\; SD = $some + summary: SQ = "; SBS = \; DBS = \\; SD = $some +components: + schemas: + Order: + description: An order for a pets from the pet store + example: + petId: 6 + quantity: 1 + id: 0 + shipDate: 2000-01-23T04:56:07.000+00:00 + complete: false + status: placed + properties: + id: + format: int64 + type: integer + petId: + format: int64 + type: integer + quantity: + format: int32 + type: integer + shipDate: + format: date-time + type: string + status: + description: Order Status + enum: + - placed + - approved + - delivered + type: string + complete: + default: false + type: boolean + title: Pet Order + type: object + xml: + name: Order + Category: + description: A category for a pet + example: + name: name + id: 6 + properties: + id: + format: int64 + type: integer + name: + type: string + title: Pet category + type: object + xml: + name: Category + User: + description: A User who is purchasing from the pet store + example: + firstName: firstName + lastName: lastName + password: password + userStatus: 6 + phone: phone + id: 0 + email: email + username: username + properties: + id: + format: int64 + type: integer + username: + type: string + firstName: + type: string + lastName: + type: string + email: + type: string + password: + type: string + phone: + type: string + userStatus: + description: User Status + format: int32 + type: integer + title: a User + type: object + xml: + name: User + Tag: + description: A tag for a pet + example: + name: name + id: 1 + properties: + id: + format: int64 + type: integer + name: + type: string + title: Pet Tag + type: object + xml: + name: Tag + Pet: + description: A pet for sale in the pet store + example: + photoUrls: + - photoUrls + - photoUrls + name: doggie + id: 0 + category: + name: name + id: 6 + tags: + - name: name + id: 1 + - name: name + id: 1 + status: available + properties: + id: + format: int64 + type: integer + category: + $ref: "#/components/schemas/Category" + name: + example: doggie + type: string + photoUrls: + items: + type: string + type: array + xml: + name: photoUrl + wrapped: true + tags: + items: + $ref: "#/components/schemas/Tag" + type: array + xml: + name: tag + wrapped: true + status: + description: pet status in the store + enum: + - available + - pending + - sold + type: string + required: + - name + - photoUrls + title: a Pet + type: object + xml: + name: Pet + ApiResponse: + description: Describes the result of uploading an image resource + example: + code: 0 + type: type + message: message + properties: + code: + format: int32 + type: integer + type: + type: string + message: + type: string + title: An uploaded response + type: object + ItemWithDollarAttributesAndExamples: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: + $name: SQ = "; SBS = \; DBS = \\; SD = $some + $id: SQ = "; SBS = \; DBS = \\; SD = $some + properties: + $id: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + $name: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + type: object + updatePetWithForm_request: + properties: + name: + description: Updated name of the pet + type: string + status: + description: Updated status of the pet + type: string + uploadFile_request: + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + image: + description: image to upload + format: binary + type: string + required: + - image + uploadMultipleFile_request: + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + images: + items: + description: image to upload + format: binary + type: string + type: array + required: + - images + _items__item_Id__something__item_SubId__get_200_response_details_Info: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: + detail$One: SQ = "; SBS = \; DBS = \\; SD = $some + detail$Two: 42 + properties: + detail$One: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + detail$Two: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: 42 + type: integer + type: object + _items__item_Id__something__item_SubId__get_200_response: + example: + name$Value: SQ = "; SBS = \; DBS = \\; SD = $some + details$Info: + detail$One: SQ = "; SBS = \; DBS = \\; SD = $some + detail$Two: 42 + item$Id: SQ = "; SBS = \; DBS = \\; SD = $some + properties: + item$Id: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + name$Value: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + details$Info: + $ref: "#/components/schemas/_items__item_Id__something__item_SubId__get_200_response_details_Info" + type: object + _items_post_request: + properties: + form$Name: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + form$Value: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + type: object + securitySchemes: + petstore_auth: + flows: + implicit: + authorizationUrl: http://petstore.swagger.io/api/oauth/dialog + scopes: + write:pets: modify pets in your account + read:pets: read your pets + type: oauth2 + api_key: + in: header + name: api_key + type: apiKey diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt new file mode 100644 index 000000000000..b9dd52637709 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt @@ -0,0 +1,51 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class ItemsApiTest { + + private val service: ItemsApiService = ItemsApiServiceImpl() + private val api: ItemsApiController = ItemsApiController(service) + + /** + * To test ItemsApiController.itemsItemIdSomethingItemSubIdGet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun itemsItemIdSomethingItemSubIdGetTest() { + val itemDollarId: kotlin.String = TODO() + val itemDollarSubId: kotlin.String = TODO() + val filterDollarType: kotlin.String = TODO() + val filterDollarSubType: kotlin.String = TODO() + val xCustomHeader: kotlin.String? = TODO() + val xCustomHeaderTwo: kotlin.String? = TODO() + val sessionDollarToken: kotlin.String? = TODO() + val sessionDollarTokenTwo: kotlin.String? = TODO() + + val response: ResponseEntity = api.itemsItemIdSomethingItemSubIdGet(itemDollarId, itemDollarSubId, filterDollarType, filterDollarSubType, xCustomHeader, xCustomHeaderTwo, sessionDollarToken, sessionDollarTokenTwo) + + // TODO: test validations + } + + /** + * To test ItemsApiController.itemsPost + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun itemsPostTest() { + val xPostHeader: kotlin.String? = TODO() + val formDollarName: kotlin.String? = TODO() + val formDollarValue: kotlin.String = TODO() + + val response: ResponseEntity = api.itemsPost(xPostHeader, formDollarName, formDollarValue) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/PetApiTest.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/PetApiTest.kt new file mode 100644 index 000000000000..2e469407743c --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/PetApiTest.kt @@ -0,0 +1,169 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class PetApiTest { + + private val service: PetApiService = PetApiServiceImpl() + private val api: PetApiController = PetApiController(service) + + /** + * To test PetApiController.addPet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun addPetTest() { + val body: Pet = TODO() + + val response: ResponseEntity = api.addPet(body) + + // TODO: test validations + } + + /** + * To test PetApiController.deletePet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun deletePetTest() { + val petId: kotlin.Long = TODO() + val apiKey: kotlin.String? = TODO() + + val response: ResponseEntity = api.deletePet(petId, apiKey) + + // TODO: test validations + } + + /** + * To test PetApiController.findPetsByStatus + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun findPetsByStatusTest() { + val status: kotlin.collections.List = TODO() + + val response: ResponseEntity> = api.findPetsByStatus(status) + + // TODO: test validations + } + + /** + * To test PetApiController.findPetsByTags + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun findPetsByTagsTest() { + val tags: kotlin.collections.List = TODO() + + val response: ResponseEntity> = api.findPetsByTags(tags) + + // TODO: test validations + } + + /** + * To test PetApiController.getImage + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getImageTest() { + val petId: kotlin.Long = TODO() + + val response: ResponseEntity = api.getImage(petId) + + // TODO: test validations + } + + /** + * To test PetApiController.getPetById + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getPetByIdTest() { + val petId: kotlin.Long = TODO() + + val response: ResponseEntity = api.getPetById(petId) + + // TODO: test validations + } + + /** + * To test PetApiController.updatePet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun updatePetTest() { + val body: Pet = TODO() + + val response: ResponseEntity = api.updatePet(body) + + // TODO: test validations + } + + /** + * To test PetApiController.updatePetWithForm + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun updatePetWithFormTest() { + val petId: kotlin.Long = TODO() + val name: kotlin.String? = TODO() + val status: kotlin.String? = TODO() + + val response: ResponseEntity = api.updatePetWithForm(petId, name, status) + + // TODO: test validations + } + + /** + * To test PetApiController.uploadFile + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun uploadFileTest() { + val petId: kotlin.Long = TODO() + val image: org.springframework.web.multipart.MultipartFile = TODO() + val additionalMetadata: kotlin.String? = TODO() + + val response: ResponseEntity = api.uploadFile(petId, image, additionalMetadata) + + // TODO: test validations + } + + /** + * To test PetApiController.uploadMultipleFile + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun uploadMultipleFileTest() { + val petId: kotlin.Long = TODO() + val images: Array = TODO() + val additionalMetadata: kotlin.String? = TODO() + + val response: ResponseEntity = api.uploadMultipleFile(petId, images, additionalMetadata) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/StoreApiTest.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/StoreApiTest.kt new file mode 100644 index 000000000000..b67568e31dab --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/StoreApiTest.kt @@ -0,0 +1,70 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class StoreApiTest { + + private val service: StoreApiService = StoreApiServiceImpl() + private val api: StoreApiController = StoreApiController(service) + + /** + * To test StoreApiController.deleteOrder + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun deleteOrderTest() { + val orderId: kotlin.String = TODO() + + val response: ResponseEntity = api.deleteOrder(orderId) + + // TODO: test validations + } + + /** + * To test StoreApiController.getInventory + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getInventoryTest() { + + val response: ResponseEntity> = api.getInventory() + + // TODO: test validations + } + + /** + * To test StoreApiController.getOrderById + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getOrderByIdTest() { + val orderId: kotlin.Long = TODO() + + val response: ResponseEntity = api.getOrderById(orderId) + + // TODO: test validations + } + + /** + * To test StoreApiController.placeOrder + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun placeOrderTest() { + val body: Order = TODO() + + val response: ResponseEntity = api.placeOrder(body) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/UserApiTest.kt b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/UserApiTest.kt new file mode 100644 index 000000000000..d7f7e9523f5f --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-3-dollar-issue-swagger2/src/test/kotlin/org/openapitools/api/UserApiTest.kt @@ -0,0 +1,146 @@ +package org.openapitools.api + +import org.openapitools.model.User +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class UserApiTest { + + private val service: UserApiService = UserApiServiceImpl() + private val api: UserApiController = UserApiController(service) + + /** + * To test UserApiController.createUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun createUserTest() { + val body: User = TODO() + + val response: ResponseEntity = api.createUser(body) + + // TODO: test validations + } + + /** + * To test UserApiController.createUsersWithArrayInput + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun createUsersWithArrayInputTest() { + val body: kotlin.collections.List = TODO() + + val response: ResponseEntity = api.createUsersWithArrayInput(body) + + // TODO: test validations + } + + /** + * To test UserApiController.createUsersWithListInput + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun createUsersWithListInputTest() { + val body: kotlin.collections.List = TODO() + + val response: ResponseEntity = api.createUsersWithListInput(body) + + // TODO: test validations + } + + /** + * To test UserApiController.deleteUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun deleteUserTest() { + val username: kotlin.String = TODO() + + val response: ResponseEntity = api.deleteUser(username) + + // TODO: test validations + } + + /** + * To test UserApiController.getUserByName + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getUserByNameTest() { + val username: kotlin.String = TODO() + + val response: ResponseEntity = api.getUserByName(username) + + // TODO: test validations + } + + /** + * To test UserApiController.loginUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun loginUserTest() { + val username: kotlin.String = TODO() + val password: kotlin.String = TODO() + + val response: ResponseEntity = api.loginUser(username, password) + + // TODO: test validations + } + + /** + * To test UserApiController.logoutUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun logoutUserTest() { + + val response: ResponseEntity = api.logoutUser() + + // TODO: test validations + } + + /** + * To test UserApiController.logoutUserOptions + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun logoutUserOptionsTest() { + + val response: ResponseEntity = api.logoutUserOptions() + + // TODO: test validations + } + + /** + * To test UserApiController.updateUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun updateUserTest() { + val username: kotlin.String = TODO() + val body: User = TODO() + + val response: ResponseEntity = api.updateUser(username, body) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-3-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-3-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 474b51456b27..b532e9076953 100644 --- a/samples/server/petstore/kotlin-springboot-3-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-3-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-3/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-3/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 474b51456b27..b532e9076953 100644 --- a/samples/server/petstore/kotlin-springboot-3/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-3/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-additionalproperties/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-additionalproperties/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 474b51456b27..b532e9076953 100644 --- a/samples/server/petstore/kotlin-springboot-additionalproperties/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-additionalproperties/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator-ignore b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator-ignore new file mode 100644 index 000000000000..7484ee590a38 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator-ignore @@ -0,0 +1,23 @@ +# OpenAPI Generator Ignore +# Generated by openapi-generator https://github.com/openapitools/openapi-generator + +# Use this file to prevent files from being overwritten by the generator. +# The patterns follow closely to .gitignore or .dockerignore. + +# As an example, the C# client generator defines ApiClient.cs. +# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line: +#ApiClient.cs + +# You can match any string of characters against a directory, file or extension with a single asterisk (*): +#foo/*/qux +# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux + +# You can recursively match patterns against a directory, file or extension with a double asterisk (**): +#foo/**/qux +# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux + +# You can also negate patterns with an exclamation (!). +# For example, you can ignore all files in a docs folder with the file extension .md: +#docs/*.md +# Then explicitly reverse the ignore rule for a single file: +#!docs/README.md diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator/FILES new file mode 100644 index 000000000000..321c9fba3a7b --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator/FILES @@ -0,0 +1,36 @@ +README.md +build.gradle.kts +gradle/wrapper/gradle-wrapper.jar +gradle/wrapper/gradle-wrapper.properties +gradlew +gradlew.bat +pom.xml +settings.gradle +src/main/kotlin/org/openapitools/Application.kt +src/main/kotlin/org/openapitools/HomeController.kt +src/main/kotlin/org/openapitools/SpringFoxConfiguration.kt +src/main/kotlin/org/openapitools/api/ApiUtil.kt +src/main/kotlin/org/openapitools/api/Exceptions.kt +src/main/kotlin/org/openapitools/api/ItemsApiController.kt +src/main/kotlin/org/openapitools/api/ItemsApiService.kt +src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt +src/main/kotlin/org/openapitools/api/PetApiController.kt +src/main/kotlin/org/openapitools/api/PetApiService.kt +src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt +src/main/kotlin/org/openapitools/api/StoreApiController.kt +src/main/kotlin/org/openapitools/api/StoreApiService.kt +src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt +src/main/kotlin/org/openapitools/api/UserApiController.kt +src/main/kotlin/org/openapitools/api/UserApiService.kt +src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt +src/main/kotlin/org/openapitools/model/Category.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt +src/main/kotlin/org/openapitools/model/ModelApiResponse.kt +src/main/kotlin/org/openapitools/model/Order.kt +src/main/kotlin/org/openapitools/model/Pet.kt +src/main/kotlin/org/openapitools/model/Tag.kt +src/main/kotlin/org/openapitools/model/User.kt +src/main/resources/application.yaml +src/main/resources/openapi.yaml diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator/VERSION b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator/VERSION new file mode 100644 index 000000000000..2fb556b60635 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/.openapi-generator/VERSION @@ -0,0 +1 @@ +7.18.0-SNAPSHOT diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/README.md b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/README.md new file mode 100644 index 000000000000..b6865a081135 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/README.md @@ -0,0 +1,21 @@ +# openAPIPetstore + +This Kotlin based [Spring Boot](https://spring.io/projects/spring-boot) application has been generated using the [OpenAPI Generator](https://github.com/OpenAPITools/openapi-generator). + +## Getting Started + +This document assumes you have either maven or gradle available, either via the wrapper or otherwise. This does not come with a gradle / maven wrapper checked in. + +By default a [`pom.xml`](pom.xml) file will be generated. If you specified `gradleBuildFile=true` when generating this project, a `build.gradle.kts` will also be generated. Note this uses [Gradle Kotlin DSL](https://github.com/gradle/kotlin-dsl). + +To build the project using maven, run: +```bash +mvn package && java -jar target/openapi-spring-1.0.0.jar +``` + +To build the project using gradle, run: +```bash +gradle build && java -jar build/libs/openapi-spring-1.0.0.jar +``` + +If all builds successfully, the server should run on [http://localhost:8080/](http://localhost:8080/) diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/build.gradle.kts b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/build.gradle.kts new file mode 100644 index 000000000000..0d536331c529 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/build.gradle.kts @@ -0,0 +1,49 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:2.6.7") + } +} + +group = "org.openapitools" +version = "1.0.0" + +repositories { + mavenCentral() +} + +tasks.withType { + kotlinOptions.jvmTarget = "11" +} + +plugins { + val kotlinVersion = "1.9.25" + id("org.jetbrains.kotlin.jvm") version kotlinVersion + id("org.jetbrains.kotlin.plugin.jpa") version kotlinVersion + id("org.jetbrains.kotlin.plugin.spring") version kotlinVersion + id("org.springframework.boot") version "2.6.7" + id("io.spring.dependency-management") version "1.0.11.RELEASE" +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("io.springfox:springfox-swagger2:2.9.2") + + implementation("com.google.code.findbugs:jsr305:3.0.2") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") + implementation("javax.validation:validation-api") + implementation("javax.annotation:javax.annotation-api:1.3.2") + testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") + testImplementation("org.springframework.boot:spring-boot-starter-test") { + exclude(module = "junit") + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradle/wrapper/gradle-wrapper.jar b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000000..e6441136f3d4 Binary files /dev/null and b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradle/wrapper/gradle-wrapper.jar differ diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradle/wrapper/gradle-wrapper.properties b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000000..80187ac30432 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradlew b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradlew new file mode 100644 index 000000000000..9d0ce634cb11 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while +APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path +[ -h "$app_path" ] +do +ls=$( ls -ld "$app_path" ) +link=${ls#*' -> '} +case $link in #( +/*) app_path=$link ;; #( +*) app_path=$APP_HOME$link ;; +esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { +echo "$*" +} >&2 + +die () { +echo +echo "$*" +echo +exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( +CYGWIN* ) cygwin=true ;; #( +Darwin* ) darwin=true ;; #( +MSYS* | MINGW* ) msys=true ;; #( +NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then +if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +# IBM's JDK on AIX uses strange locations for the executables +JAVACMD=$JAVA_HOME/jre/sh/java +else +JAVACMD=$JAVA_HOME/bin/java +fi +if [ ! -x "$JAVACMD" ] ; then +die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +else +JAVACMD=java +if ! command -v java >/dev/null 2>&1 +then +die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then +case $MAX_FD in #( +max*) +# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +MAX_FD=$( ulimit -H -n ) || +warn "Could not query maximum file descriptor limit" +esac +case $MAX_FD in #( +'' | soft) :;; #( +*) +# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +ulimit -n "$MAX_FD" || +warn "Could not set maximum file descriptor limit to $MAX_FD" +esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then +APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) +CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + +JAVACMD=$( cygpath --unix "$JAVACMD" ) + +# Now convert the arguments - kludge to limit ourselves to /bin/sh +for arg do +if +case $arg in #( +-*) false ;; # don't mess with options #( +/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath +[ -e "$t" ] ;; #( +*) false ;; +esac +then +arg=$( cygpath --path --ignore --mixed "$arg" ) +fi +# Roll the args list around exactly as many times as the number of +# args, so each arg winds up back in the position where it started, but +# possibly modified. +# +# NB: a `for` loop captures its iteration list before it begins, so +# changing the positional parameters here affects neither the number of +# iterations, nor the values presented in `arg`. +shift # remove old arg +set -- "$@" "$arg" # push replacement arg +done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ +"-Dorg.gradle.appname=$APP_BASE_NAME" \ +-classpath "$CLASSPATH" \ +org.gradle.wrapper.GradleWrapperMain \ +"$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then +die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( +printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | +xargs -n1 | +sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | +tr '\n' ' ' +)" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradlew.bat b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradlew.bat new file mode 100644 index 000000000000..25da30dbdeee --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/pom.xml b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/pom.xml new file mode 100644 index 000000000000..3fa348144d65 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/pom.xml @@ -0,0 +1,138 @@ + + 4.0.0 + org.openapitools + openapi-spring + jar + openapi-spring + 1.0.0 + + 2.9.2 + 3.0.2 + 1.3.2 + 1.6.21 + + 1.6.21 + UTF-8 + + + org.springframework.boot + spring-boot-starter-parent + 2.7.15 + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/test/kotlin + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin.version} + + + spring + + 11 + + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + + org.jetbrains.kotlin + kotlin-maven-allopen + ${kotlin.version} + + + + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-reflect + ${kotlin.version} + + + org.springframework.boot + spring-boot-starter-web + + + + + + io.springfox + springfox-swagger2 + ${springfox-swagger2.version} + + + + + com.google.code.findbugs + jsr305 + ${findbugs-jsr305.version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + com.fasterxml.jackson.module + jackson-module-kotlin + + + + javax.validation + validation-api + + + javax.annotation + javax.annotation-api + ${javax-annotation.version} + provided + + + org.jetbrains.kotlin + kotlin-test-junit5 + ${kotlin-test-junit5.version} + test + + + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/settings.gradle b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/settings.gradle new file mode 100644 index 000000000000..14844905cd40 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/settings.gradle @@ -0,0 +1,15 @@ +pluginManagement { + repositories { + maven { url = uri("https://repo.spring.io/snapshot") } + maven { url = uri("https://repo.spring.io/milestone") } + gradlePluginPortal() + } + resolutionStrategy { + eachPlugin { + if (requested.id.id == "org.springframework.boot") { + useModule("org.springframework.boot:spring-boot-gradle-plugin:${requested.version}") + } + } + } +} +rootProject.name = "openapi-spring" diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/Application.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/Application.kt new file mode 100644 index 000000000000..2fe6de62479e --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/Application.kt @@ -0,0 +1,13 @@ +package org.openapitools + +import org.springframework.boot.runApplication +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.context.annotation.ComponentScan + +@SpringBootApplication +@ComponentScan(basePackages = ["org.openapitools", "org.openapitools.api", "org.openapitools.model"]) +class Application + +fun main(args: Array) { + runApplication(*args) +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/HomeController.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/HomeController.kt new file mode 100644 index 000000000000..310e7f4d62e3 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/HomeController.kt @@ -0,0 +1,12 @@ +package org.openapitools + +import org.springframework.context.annotation.Bean +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.RequestMapping + +/** + * Home redirection to OpenAPI api documentation + */ +@Controller +class HomeController { +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/SpringFoxConfiguration.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/SpringFoxConfiguration.kt new file mode 100644 index 000000000000..a2628c31c8d7 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/SpringFoxConfiguration.kt @@ -0,0 +1,64 @@ +package org.openapitools + +import org.springframework.beans.factory.annotation.Value +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.web.util.UriComponentsBuilder +import springfox.documentation.builders.ApiInfoBuilder +import springfox.documentation.builders.RequestHandlerSelectors +import springfox.documentation.service.ApiInfo +import springfox.documentation.service.Contact +import springfox.documentation.spi.DocumentationType +import springfox.documentation.spring.web.paths.Paths +import springfox.documentation.spring.web.paths.RelativePathProvider +import springfox.documentation.spring.web.plugins.Docket +import springfox.documentation.swagger2.annotations.EnableSwagger2 +import javax.servlet.ServletContext + + +@javax.annotation.Generated(value = ["org.openapitools.codegen.languages.KotlinSpringServerCodegen"], comments = "Generator version: 7.18.0-SNAPSHOT") +@Configuration +@EnableSwagger2 +class SpringFoxConfiguration { + + fun apiInfo(): ApiInfo { + return ApiInfoBuilder() + .title("OpenAPI Petstore") + .description("This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters.") + .license("Apache-2.0") + .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") + .termsOfServiceUrl("") + .version("1.0.0") + .contact(Contact("", "", "")) + .build() + } + + @Bean + fun customImplementation(servletContext: ServletContext, @Value("\${openapi.openAPIPetstore.base-path:\${api.base-path:/v2}}") basePath: String): Docket { + return Docket(DocumentationType.SWAGGER_2) + .select() + .apis(RequestHandlerSelectors.basePackage("org.openapitools.api")) + .build() + .pathProvider(BasePathAwareRelativePathProvider(servletContext, basePath)) + .directModelSubstitute(java.time.LocalDate::class.java, java.sql.Date::class.java) + .directModelSubstitute(java.time.OffsetDateTime::class.java, java.util.Date::class.java) + .apiInfo(apiInfo()) + } + + class BasePathAwareRelativePathProvider(servletContext: ServletContext, private val basePath: String) : + RelativePathProvider(servletContext) { + + override fun applicationPath(): String { + return Paths.removeAdjacentForwardSlashes( + UriComponentsBuilder.fromPath(super.applicationPath()).path(basePath).build().toString() + ) + } + + override fun getOperationPath(operationPath: String): String { + val uriComponentsBuilder = UriComponentsBuilder.fromPath("/") + return Paths.removeAdjacentForwardSlashes( + uriComponentsBuilder.path(operationPath.replaceFirst("^$basePath", "")).build().toString() + ) + } + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ApiUtil.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ApiUtil.kt new file mode 100644 index 000000000000..88e892d0f49a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ApiUtil.kt @@ -0,0 +1,19 @@ +package org.openapitools.api + +import org.springframework.web.context.request.NativeWebRequest + +import javax.servlet.http.HttpServletResponse +import java.io.IOException + +object ApiUtil { + fun setExampleResponse(req: NativeWebRequest, contentType: String, example: String) { + try { + val res = req.getNativeResponse(HttpServletResponse::class.java) + res?.characterEncoding = "UTF-8" + res?.addHeader("Content-Type", contentType) + res?.writer?.print(example) + } catch (e: IOException) { + throw RuntimeException(e) + } + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/Exceptions.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/Exceptions.kt new file mode 100644 index 000000000000..901db1237ee7 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/Exceptions.kt @@ -0,0 +1,30 @@ +package org.openapitools.api + +import org.springframework.context.annotation.Configuration +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.ControllerAdvice +import org.springframework.web.bind.annotation.ExceptionHandler +import javax.servlet.http.HttpServletResponse +import javax.validation.ConstraintViolationException + +// TODO Extend ApiException for custom exception handling, e.g. the below NotFound exception +sealed class ApiException(msg: String, val code: Int) : Exception(msg) + +class NotFoundException(msg: String, code: Int = HttpStatus.NOT_FOUND.value()) : ApiException(msg, code) + +@Configuration("org.openapitools.api.DefaultExceptionHandler") +@ControllerAdvice +class DefaultExceptionHandler { + + @ExceptionHandler(value = [ApiException::class]) + fun onApiException(ex: ApiException, response: HttpServletResponse): Unit = + response.sendError(ex.code, ex.message) + + @ExceptionHandler(value = [NotImplementedError::class]) + fun onNotImplemented(ex: NotImplementedError, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.NOT_IMPLEMENTED.value()) + + @ExceptionHandler(value = [ConstraintViolationException::class]) + fun onConstraintViolation(ex: ConstraintViolationException, response: HttpServletResponse): Unit = + response.sendError(HttpStatus.BAD_REQUEST.value(), ex.constraintViolations.joinToString(", ") { it.message }) +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiController.kt new file mode 100644 index 000000000000..d1a61211e519 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -0,0 +1,96 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.Valid +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "items", description = "The items API") +class ItemsApiController(@Autowired(required = true) val service: ItemsApiService) { + + + @ApiOperation( + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + nickname = "itemsItemIdSomethingItemSubIdGet", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + response = ItemsItemIdSomethingItemSubIdGet200Response::class + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemsItemIdSomethingItemSubIdGet200Response::class)] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item$Id}/something/{item$SubId}" */], + produces = ["application/json"] + ) + fun itemsItemIdSomethingItemSubIdGet( + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.itemsItemIdSomethingItemSubIdGet(itemDollarId, itemDollarSubId, filterDollarType, filterDollarSubType, xCustomHeader, xCustomHeaderTwo, sessionDollarToken, sessionDollarTokenTwo), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + nickname = "itemsPost", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + response = ItemWithDollarAttributesAndExamples::class + ) + @ApiResponses( + value = [ApiResponse(code = 201, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemWithDollarAttributesAndExamples::class)] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ITEMS_POST /* "/items" */], + produces = ["application/json"], + consumes = ["application/x-www-form-urlencoded"] + ) + fun itemsPost( + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.itemsPost(xPostHeader, formDollarName, formDollarValue), HttpStatus.valueOf(201)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiService.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiService.kt new file mode 100644 index 000000000000..918cb1610b33 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiService.kt @@ -0,0 +1,36 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response + +interface ItemsApiService { + + /** + * GET /items/{item$Id}/something/{item$SubId} : SQ = "; SBS = \; DBS = \\; SD = $some + * SQ = "; SBS = \; DBS = \\; SD = $some + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some (required) + * @param itemDollarSubId SQ = "; SBS = \; DBS = \\; SD = $some (required) + * @param filterDollarType SQ = "; SBS = \; DBS = \\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + * @param filterDollarSubType SQ = "; SBS = \; DBS = \\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + * @param xCustomHeader SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param xCustomHeaderTwo SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param sessionDollarToken SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param sessionDollarTokenTwo SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @return SQ = "; SBS = \; DBS = \\; SD = $some (status code 200) + * @see ItemsApi#itemsItemIdSomethingItemSubIdGet + */ + fun itemsItemIdSomethingItemSubIdGet(itemDollarId: kotlin.String, itemDollarSubId: kotlin.String, filterDollarType: kotlin.String, filterDollarSubType: kotlin.String, xCustomHeader: kotlin.String?, xCustomHeaderTwo: kotlin.String?, sessionDollarToken: kotlin.String?, sessionDollarTokenTwo: kotlin.String?): ItemsItemIdSomethingItemSubIdGet200Response + + /** + * POST /items : SQ = "; SBS = \; DBS = \\; SD = $some + * SQ = "; SBS = \; DBS = \\; SD = $some + * + * @param xPostHeader SQ = "; SBS = \; DBS = \\; SD = $some (optional) + * @param formDollarName SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional) + * @param formDollarValue SQ = \"; SBS = \\; DBS = \\\\; SD = $some (optional, default to "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + * @return SQ = "; SBS = \; DBS = \\; SD = $some (status code 201) + * @see ItemsApi#itemsPost + */ + fun itemsPost(xPostHeader: kotlin.String?, formDollarName: kotlin.String?, formDollarValue: kotlin.String): ItemWithDollarAttributesAndExamples +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt new file mode 100644 index 000000000000..5753996f7855 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/ItemsApiServiceImpl.kt @@ -0,0 +1,16 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import org.springframework.stereotype.Service +@Service +class ItemsApiServiceImpl : ItemsApiService { + + override fun itemsItemIdSomethingItemSubIdGet(itemDollarId: kotlin.String, itemDollarSubId: kotlin.String, filterDollarType: kotlin.String, filterDollarSubType: kotlin.String, xCustomHeader: kotlin.String?, xCustomHeaderTwo: kotlin.String?, sessionDollarToken: kotlin.String?, sessionDollarTokenTwo: kotlin.String?): ItemsItemIdSomethingItemSubIdGet200Response { + TODO("Implement me") + } + + override fun itemsPost(xPostHeader: kotlin.String?, formDollarName: kotlin.String?, formDollarValue: kotlin.String): ItemWithDollarAttributesAndExamples { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt new file mode 100644 index 000000000000..acce2c6aef97 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt @@ -0,0 +1,278 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.Valid +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "pet", description = "The pet API") +class PetApiController(@Autowired(required = true) val service: PetApiService) { + + + @ApiOperation( + value = "Add a new pet to the store", + nickname = "addPet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) + @ApiResponses( + value = [ApiResponse(code = 405, message = "Invalid input")] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ADD_PET /* "/pet" */], + consumes = ["application/json", "application/xml"] + ) + fun addPet( + @ApiParam(value = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody body: Pet + ): ResponseEntity { + return ResponseEntity(service.addPet(body), HttpStatus.valueOf(405)) + } + + + @ApiOperation( + value = "Deletes a pet", + nickname = "deletePet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid pet value")] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_PET /* "/pet/{petId}" */] + ) + fun deletePet( + @ApiParam(value = "Pet id to delete", required = true) @PathVariable("petId") petId: kotlin.Long, + @ApiParam(value = "") @RequestHeader(value = "api_key", required = false) apiKey: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.deletePet(petId, apiKey), HttpStatus.valueOf(400)) + } + + + @ApiOperation( + value = "Finds Pets by status", + nickname = "findPetsByStatus", + notes = "Multiple status values can be provided with comma separated strings", + response = Pet::class, + responseContainer = "List", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_FIND_PETS_BY_STATUS /* "/pet/findByStatus" */], + produces = ["application/xml", "application/json"] + ) + fun findPetsByStatus( + @NotNull @ApiParam(value = "Status values that need to be considered for filter", required = true, allowableValues = "available, pending, sold") @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List + ): ResponseEntity> { + return ResponseEntity(service.findPetsByStatus(status), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Finds Pets by tags", + nickname = "findPetsByTags", + notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + response = Pet::class, + responseContainer = "List", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_FIND_PETS_BY_TAGS /* "/pet/findByTags" */], + produces = ["application/xml", "application/json"] + ) + fun findPetsByTags( + @NotNull @ApiParam(value = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List + ): ResponseEntity> { + return ResponseEntity(service.findPetsByTags(tags), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Get an image", + nickname = "getImage", + notes = "", + response = org.springframework.core.io.Resource::class, + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = org.springframework.core.io.Resource::class)] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_IMAGE /* "/pet/{petId}/getImage" */], + produces = ["application/octet-stream"] + ) + fun getImage( + @ApiParam(value = "ID of pet to get image", required = true) @PathVariable("petId") petId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(service.getImage(petId), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Find pet by ID", + nickname = "getPetById", + notes = "Returns a single pet", + response = Pet::class, + authorizations = [Authorization(value = "api_key")] + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_PET_BY_ID /* "/pet/{petId}" */], + produces = ["application/xml", "application/json"] + ) + fun getPetById( + @ApiParam(value = "ID of pet to return", required = true) @PathVariable("petId") petId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(service.getPetById(petId), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Update an existing pet", + nickname = "updatePet", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")] + ) + @RequestMapping( + method = [RequestMethod.PUT], + value = [PATH_UPDATE_PET /* "/pet" */], + consumes = ["application/json", "application/xml"] + ) + fun updatePet( + @ApiParam(value = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody body: Pet + ): ResponseEntity { + return ResponseEntity(service.updatePet(body), HttpStatus.valueOf(400)) + } + + + @ApiOperation( + value = "Updates a pet in the store with form data", + nickname = "updatePetWithForm", + notes = "", + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) + @ApiResponses( + value = [ApiResponse(code = 405, message = "Invalid input")] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPDATE_PET_WITH_FORM /* "/pet/{petId}" */], + consumes = ["application/x-www-form-urlencoded"] + ) + fun updatePetWithForm( + @ApiParam(value = "ID of pet that needs to be updated", required = true) @PathVariable("petId") petId: kotlin.Long, + @ApiParam(value = "Updated name of the pet") @Valid @RequestParam(value = "name", required = false) name: kotlin.String?, + @ApiParam(value = "Updated status of the pet") @Valid @RequestParam(value = "status", required = false) status: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.updatePetWithForm(petId, name, status), HttpStatus.valueOf(405)) + } + + + @ApiOperation( + value = "uploads an image", + nickname = "uploadFile", + notes = "", + response = ModelApiResponse::class, + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPLOAD_FILE /* "/pet/{petId}/uploadImage" */], + produces = ["application/json"], + consumes = ["multipart/form-data"] + ) + fun uploadFile( + @ApiParam(value = "ID of pet to update", required = true) @PathVariable("petId") petId: kotlin.Long, + @ApiParam(value = "file detail") @Valid @RequestPart("image", required = true) image: org.springframework.web.multipart.MultipartFile, + @ApiParam(value = "Additional data to pass to server") @Valid @RequestParam(value = "additionalMetadata", required = false) additionalMetadata: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.uploadFile(petId, image, additionalMetadata), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "uploads multiple images", + nickname = "uploadMultipleFile", + notes = "", + response = ModelApiResponse::class, + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_UPLOAD_MULTIPLE_FILE /* "/pet/{petId}/uploadMultipleImage" */], + produces = ["application/json"], + consumes = ["multipart/form-data"] + ) + fun uploadMultipleFile( + @ApiParam(value = "ID of pet to update", required = true) @PathVariable("petId") petId: kotlin.Long, + @ApiParam(value = "file detail") @Valid @RequestPart("images", required = true) images: Array, + @ApiParam(value = "Additional data to pass to server") @Valid @RequestParam(value = "additionalMetadata", required = false) additionalMetadata: kotlin.String? + ): ResponseEntity { + return ResponseEntity(service.uploadMultipleFile(petId, images, additionalMetadata), HttpStatus.valueOf(200)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ADD_PET: String = "/pet" + const val PATH_DELETE_PET: String = "/pet/{petId}" + const val PATH_FIND_PETS_BY_STATUS: String = "/pet/findByStatus" + const val PATH_FIND_PETS_BY_TAGS: String = "/pet/findByTags" + const val PATH_GET_IMAGE: String = "/pet/{petId}/getImage" + const val PATH_GET_PET_BY_ID: String = "/pet/{petId}" + const val PATH_UPDATE_PET: String = "/pet" + const val PATH_UPDATE_PET_WITH_FORM: String = "/pet/{petId}" + const val PATH_UPLOAD_FILE: String = "/pet/{petId}/uploadImage" + const val PATH_UPLOAD_MULTIPLE_FILE: String = "/pet/{petId}/uploadMultipleImage" + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiService.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiService.kt new file mode 100644 index 000000000000..fe00af396a96 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiService.kt @@ -0,0 +1,114 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet + +interface PetApiService { + + /** + * POST /pet : Add a new pet to the store + * + * @param body Pet object that needs to be added to the store (required) + * @return Invalid input (status code 405) + * @see PetApi#addPet + */ + fun addPet(body: Pet): Unit + + /** + * DELETE /pet/{petId} : Deletes a pet + * + * @param petId Pet id to delete (required) + * @param apiKey (optional) + * @return Invalid pet value (status code 400) + * @see PetApi#deletePet + */ + fun deletePet(petId: kotlin.Long, apiKey: kotlin.String?): Unit + + /** + * GET /pet/findByStatus : Finds Pets by status + * Multiple status values can be provided with comma separated strings + * + * @param status Status values that need to be considered for filter (required) + * @return successful operation (status code 200) + * or Invalid status value (status code 400) + * @see PetApi#findPetsByStatus + */ + fun findPetsByStatus(status: kotlin.collections.List): List + + /** + * GET /pet/findByTags : Finds Pets by tags + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + * + * @param tags Tags to filter by (required) + * @return successful operation (status code 200) + * or Invalid tag value (status code 400) + * @deprecated + * @see PetApi#findPetsByTags + */ + fun findPetsByTags(tags: kotlin.collections.List): List + + /** + * GET /pet/{petId}/getImage : Get an image + * + * @param petId ID of pet to get image (required) + * @return successful operation (status code 200) + * @see PetApi#getImage + */ + fun getImage(petId: kotlin.Long): org.springframework.core.io.Resource + + /** + * GET /pet/{petId} : Find pet by ID + * Returns a single pet + * + * @param petId ID of pet to return (required) + * @return successful operation (status code 200) + * or Invalid ID supplied (status code 400) + * or Pet not found (status code 404) + * @see PetApi#getPetById + */ + fun getPetById(petId: kotlin.Long): Pet + + /** + * PUT /pet : Update an existing pet + * + * @param body Pet object that needs to be added to the store (required) + * @return Invalid ID supplied (status code 400) + * or Pet not found (status code 404) + * or Validation exception (status code 405) + * @see PetApi#updatePet + */ + fun updatePet(body: Pet): Unit + + /** + * POST /pet/{petId} : Updates a pet in the store with form data + * + * @param petId ID of pet that needs to be updated (required) + * @param name Updated name of the pet (optional) + * @param status Updated status of the pet (optional) + * @return Invalid input (status code 405) + * @see PetApi#updatePetWithForm + */ + fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?): Unit + + /** + * POST /pet/{petId}/uploadImage : uploads an image + * + * @param petId ID of pet to update (required) + * @param image image to upload (required) + * @param additionalMetadata Additional data to pass to server (optional) + * @return successful operation (status code 200) + * @see PetApi#uploadFile + */ + fun uploadFile(petId: kotlin.Long, image: org.springframework.web.multipart.MultipartFile, additionalMetadata: kotlin.String?): ModelApiResponse + + /** + * POST /pet/{petId}/uploadMultipleImage : uploads multiple images + * + * @param petId ID of pet to update (required) + * @param images (required) + * @param additionalMetadata Additional data to pass to server (optional) + * @return successful operation (status code 200) + * @see PetApi#uploadMultipleFile + */ + fun uploadMultipleFile(petId: kotlin.Long, images: Array, additionalMetadata: kotlin.String?): ModelApiResponse +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt new file mode 100644 index 000000000000..5b1b8e57d8be --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/PetApiServiceImpl.kt @@ -0,0 +1,48 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import org.springframework.stereotype.Service +@Service +class PetApiServiceImpl : PetApiService { + + override fun addPet(body: Pet): Unit { + TODO("Implement me") + } + + override fun deletePet(petId: kotlin.Long, apiKey: kotlin.String?): Unit { + TODO("Implement me") + } + + override fun findPetsByStatus(status: kotlin.collections.List): List { + TODO("Implement me") + } + + override fun findPetsByTags(tags: kotlin.collections.List): List { + TODO("Implement me") + } + + override fun getImage(petId: kotlin.Long): org.springframework.core.io.Resource { + TODO("Implement me") + } + + override fun getPetById(petId: kotlin.Long): Pet { + TODO("Implement me") + } + + override fun updatePet(body: Pet): Unit { + TODO("Implement me") + } + + override fun updatePetWithForm(petId: kotlin.Long, name: kotlin.String?, status: kotlin.String?): Unit { + TODO("Implement me") + } + + override fun uploadFile(petId: kotlin.Long, image: org.springframework.web.multipart.MultipartFile, additionalMetadata: kotlin.String?): ModelApiResponse { + TODO("Implement me") + } + + override fun uploadMultipleFile(petId: kotlin.Long, images: Array, additionalMetadata: kotlin.String?): ModelApiResponse { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt new file mode 100644 index 000000000000..755eb01d364d --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt @@ -0,0 +1,127 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.Valid +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "store", description = "The store API") +class StoreApiController(@Autowired(required = true) val service: StoreApiService) { + + + @ApiOperation( + value = "Delete purchase order by ID", + nickname = "deleteOrder", + notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors" + ) + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_ORDER /* "/store/order/{orderId}" */] + ) + fun deleteOrder( + @ApiParam(value = "ID of the order that needs to be deleted", required = true) @PathVariable("orderId") orderId: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.deleteOrder(orderId), HttpStatus.valueOf(400)) + } + + + @ApiOperation( + value = "Returns pet inventories by status", + nickname = "getInventory", + notes = "Returns a map of status codes to quantities", + response = kotlin.Int::class, + responseContainer = "Map", + authorizations = [Authorization(value = "api_key")] + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_INVENTORY /* "/store/inventory" */], + produces = ["application/json"] + ) + fun getInventory(): ResponseEntity> { + return ResponseEntity(service.getInventory(), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Find purchase order by ID", + nickname = "getOrderById", + notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions", + response = Order::class + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_ORDER_BY_ID /* "/store/order/{orderId}" */], + produces = ["application/xml", "application/json"] + ) + fun getOrderById( + @Min(value=1L) @Max(value=5L) @ApiParam(value = "ID of pet that needs to be fetched", required = true) @PathVariable("orderId") orderId: kotlin.Long + ): ResponseEntity { + return ResponseEntity(service.getOrderById(orderId), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Place an order for a pet", + nickname = "placeOrder", + notes = "", + response = Order::class + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_PLACE_ORDER /* "/store/order" */], + produces = ["application/xml", "application/json"] + ) + fun placeOrder( + @ApiParam(value = "order placed for purchasing the pet", required = true) @Valid @RequestBody body: Order + ): ResponseEntity { + return ResponseEntity(service.placeOrder(body), HttpStatus.valueOf(200)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_DELETE_ORDER: String = "/store/order/{orderId}" + const val PATH_GET_INVENTORY: String = "/store/inventory" + const val PATH_GET_ORDER_BY_ID: String = "/store/order/{orderId}" + const val PATH_PLACE_ORDER: String = "/store/order" + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt new file mode 100644 index 000000000000..c65ddf31c90a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -0,0 +1,48 @@ +package org.openapitools.api + +import org.openapitools.model.Order + +interface StoreApiService { + + /** + * DELETE /store/order/{orderId} : Delete purchase order by ID + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * + * @param orderId ID of the order that needs to be deleted (required) + * @return Invalid ID supplied (status code 400) + * or Order not found (status code 404) + * @see StoreApi#deleteOrder + */ + fun deleteOrder(orderId: kotlin.String): Unit + + /** + * GET /store/inventory : Returns pet inventories by status + * Returns a map of status codes to quantities + * + * @return successful operation (status code 200) + * @see StoreApi#getInventory + */ + fun getInventory(): Map + + /** + * GET /store/order/{orderId} : Find purchase order by ID + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * + * @param orderId ID of pet that needs to be fetched (required) + * @return successful operation (status code 200) + * or Invalid ID supplied (status code 400) + * or Order not found (status code 404) + * @see StoreApi#getOrderById + */ + fun getOrderById(orderId: kotlin.Long): Order + + /** + * POST /store/order : Place an order for a pet + * + * @param body order placed for purchasing the pet (required) + * @return successful operation (status code 200) + * or Invalid Order (status code 400) + * @see StoreApi#placeOrder + */ + fun placeOrder(body: Order): Order +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt new file mode 100644 index 000000000000..7e733e28dc50 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/StoreApiServiceImpl.kt @@ -0,0 +1,23 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import org.springframework.stereotype.Service +@Service +class StoreApiServiceImpl : StoreApiService { + + override fun deleteOrder(orderId: kotlin.String): Unit { + TODO("Implement me") + } + + override fun getInventory(): Map { + TODO("Implement me") + } + + override fun getOrderById(orderId: kotlin.Long): Order { + TODO("Implement me") + } + + override fun placeOrder(body: Order): Order { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt new file mode 100644 index 000000000000..34a1ec737fb2 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt @@ -0,0 +1,223 @@ +package org.openapitools.api + +import org.openapitools.model.User +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.Valid +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "user", description = "The user API") +class UserApiController(@Autowired(required = true) val service: UserApiService) { + + + @ApiOperation( + value = "Create user", + nickname = "createUser", + notes = "This can only be done by the logged in user." + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USER /* "/user" */] + ) + fun createUser( + @ApiParam(value = "Created user object", required = true) @Valid @RequestBody body: User + ): ResponseEntity { + return ResponseEntity(service.createUser(body), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Creates list of users with given input array", + nickname = "createUsersWithArrayInput", + notes = "" + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USERS_WITH_ARRAY_INPUT /* "/user/createWithArray" */] + ) + fun createUsersWithArrayInput( + @ApiParam(value = "List of user object", required = true) @Valid @RequestBody body: kotlin.collections.List + ): ResponseEntity { + return ResponseEntity(service.createUsersWithArrayInput(body), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Creates list of users with given input array", + nickname = "createUsersWithListInput", + notes = "" + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_CREATE_USERS_WITH_LIST_INPUT /* "/user/createWithList" */] + ) + fun createUsersWithListInput( + @ApiParam(value = "List of user object", required = true) @Valid @RequestBody body: kotlin.collections.List + ): ResponseEntity { + return ResponseEntity(service.createUsersWithListInput(body), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Delete user", + nickname = "deleteUser", + notes = "This can only be done by the logged in user." + ) + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] + ) + @RequestMapping( + method = [RequestMethod.DELETE], + value = [PATH_DELETE_USER /* "/user/{username}" */] + ) + fun deleteUser( + @ApiParam(value = "The name that needs to be deleted", required = true) @PathVariable("username") username: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.deleteUser(username), HttpStatus.valueOf(400)) + } + + + @ApiOperation( + value = "Get user by user name", + nickname = "getUserByName", + notes = "", + response = User::class + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_GET_USER_BY_NAME /* "/user/{username}" */], + produces = ["application/xml", "application/json"] + ) + fun getUserByName( + @ApiParam(value = "The name that needs to be fetched. Use user1 for testing.", required = true) @PathVariable("username") username: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.getUserByName(username), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Logs user into the system", + nickname = "loginUser", + notes = "", + response = kotlin.String::class + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_LOGIN_USER /* "/user/login" */], + produces = ["application/xml", "application/json"] + ) + fun loginUser( + @NotNull @ApiParam(value = "The user name for login", required = true) @Valid @RequestParam(value = "username", required = true) username: kotlin.String, + @NotNull @ApiParam(value = "The password for login in clear text", required = true) @Valid @RequestParam(value = "password", required = true) password: kotlin.String + ): ResponseEntity { + return ResponseEntity(service.loginUser(username, password), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Logs out current logged in user session", + nickname = "logoutUser", + notes = "" + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "successful operation")] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_LOGOUT_USER /* "/user/logout" */] + ) + fun logoutUser(): ResponseEntity { + return ResponseEntity(service.logoutUser(), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "logoutUserOptions", + nickname = "logoutUserOptions", + notes = "" + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "endpoint configuration response")] + ) + @RequestMapping( + method = [RequestMethod.OPTIONS], + value = [PATH_LOGOUT_USER_OPTIONS /* "/user/logout" */] + ) + fun logoutUserOptions(): ResponseEntity { + return ResponseEntity(service.logoutUserOptions(), HttpStatus.valueOf(200)) + } + + + @ApiOperation( + value = "Updated user", + nickname = "updateUser", + notes = "This can only be done by the logged in user." + ) + @ApiResponses( + value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")] + ) + @RequestMapping( + method = [RequestMethod.PUT], + value = [PATH_UPDATE_USER /* "/user/{username}" */] + ) + fun updateUser( + @ApiParam(value = "name that need to be deleted", required = true) @PathVariable("username") username: kotlin.String, + @ApiParam(value = "Updated user object", required = true) @Valid @RequestBody body: User + ): ResponseEntity { + return ResponseEntity(service.updateUser(username, body), HttpStatus.valueOf(400)) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_CREATE_USER: String = "/user" + const val PATH_CREATE_USERS_WITH_ARRAY_INPUT: String = "/user/createWithArray" + const val PATH_CREATE_USERS_WITH_LIST_INPUT: String = "/user/createWithList" + const val PATH_DELETE_USER: String = "/user/{username}" + const val PATH_GET_USER_BY_NAME: String = "/user/{username}" + const val PATH_LOGIN_USER: String = "/user/login" + const val PATH_LOGOUT_USER: String = "/user/logout" + const val PATH_LOGOUT_USER_OPTIONS: String = "/user/logout" + const val PATH_UPDATE_USER: String = "/user/{username}" + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiService.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiService.kt new file mode 100644 index 000000000000..6942dc3ede0a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiService.kt @@ -0,0 +1,95 @@ +package org.openapitools.api + +import org.openapitools.model.User + +interface UserApiService { + + /** + * POST /user : Create user + * This can only be done by the logged in user. + * + * @param body Created user object (required) + * @return successful operation (status code 200) + * @see UserApi#createUser + */ + fun createUser(body: User): Unit + + /** + * POST /user/createWithArray : Creates list of users with given input array + * + * @param body List of user object (required) + * @return successful operation (status code 200) + * @see UserApi#createUsersWithArrayInput + */ + fun createUsersWithArrayInput(body: kotlin.collections.List): Unit + + /** + * POST /user/createWithList : Creates list of users with given input array + * + * @param body List of user object (required) + * @return successful operation (status code 200) + * @see UserApi#createUsersWithListInput + */ + fun createUsersWithListInput(body: kotlin.collections.List): Unit + + /** + * DELETE /user/{username} : Delete user + * This can only be done by the logged in user. + * + * @param username The name that needs to be deleted (required) + * @return Invalid username supplied (status code 400) + * or User not found (status code 404) + * @see UserApi#deleteUser + */ + fun deleteUser(username: kotlin.String): Unit + + /** + * GET /user/{username} : Get user by user name + * + * @param username The name that needs to be fetched. Use user1 for testing. (required) + * @return successful operation (status code 200) + * or Invalid username supplied (status code 400) + * or User not found (status code 404) + * @see UserApi#getUserByName + */ + fun getUserByName(username: kotlin.String): User + + /** + * GET /user/login : Logs user into the system + * + * @param username The user name for login (required) + * @param password The password for login in clear text (required) + * @return successful operation (status code 200) + * or Invalid username/password supplied (status code 400) + * @see UserApi#loginUser + */ + fun loginUser(username: kotlin.String, password: kotlin.String): kotlin.String + + /** + * GET /user/logout : Logs out current logged in user session + * + * @return successful operation (status code 200) + * @see UserApi#logoutUser + */ + fun logoutUser(): Unit + + /** + * OPTIONS /user/logout : logoutUserOptions + * + * @return endpoint configuration response (status code 200) + * @see UserApi#logoutUserOptions + */ + fun logoutUserOptions(): Unit + + /** + * PUT /user/{username} : Updated user + * This can only be done by the logged in user. + * + * @param username name that need to be deleted (required) + * @param body Updated user object (required) + * @return Invalid user supplied (status code 400) + * or User not found (status code 404) + * @see UserApi#updateUser + */ + fun updateUser(username: kotlin.String, body: User): Unit +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt new file mode 100644 index 000000000000..f0798bd1695a --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/api/UserApiServiceImpl.kt @@ -0,0 +1,43 @@ +package org.openapitools.api + +import org.openapitools.model.User +import org.springframework.stereotype.Service +@Service +class UserApiServiceImpl : UserApiService { + + override fun createUser(body: User): Unit { + TODO("Implement me") + } + + override fun createUsersWithArrayInput(body: kotlin.collections.List): Unit { + TODO("Implement me") + } + + override fun createUsersWithListInput(body: kotlin.collections.List): Unit { + TODO("Implement me") + } + + override fun deleteUser(username: kotlin.String): Unit { + TODO("Implement me") + } + + override fun getUserByName(username: kotlin.String): User { + TODO("Implement me") + } + + override fun loginUser(username: kotlin.String, password: kotlin.String): kotlin.String { + TODO("Implement me") + } + + override fun logoutUser(): Unit { + TODO("Implement me") + } + + override fun logoutUserOptions(): Unit { + TODO("Implement me") + } + + override fun updateUser(username: kotlin.String, body: User): Unit { + TODO("Implement me") + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Category.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Category.kt new file mode 100644 index 000000000000..8514f2c8ba00 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Category.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * A category for a pet + * @param id + * @param name + */ +data class Category( + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("name") val name: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..f09c9e4036f2 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..ce959d5caa44 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..f1572d669057 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @ApiModelProperty(example = "42", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt new file mode 100644 index 000000000000..58be39aeacfc --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt @@ -0,0 +1,40 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * Describes the result of uploading an image resource + * @param code + * @param type + * @param message + */ +data class ModelApiResponse( + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("code") val code: kotlin.Int? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("type") val type: kotlin.String? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("message") val message: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Order.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Order.kt new file mode 100644 index 000000000000..c67dc14ec918 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Order.kt @@ -0,0 +1,74 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * An order for a pets from the pet store + * @param id + * @param petId + * @param quantity + * @param shipDate + * @param status Order Status + * @param complete + */ +data class Order( + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("petId") val petId: kotlin.Long? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("quantity") val quantity: kotlin.Int? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("shipDate") val shipDate: java.time.OffsetDateTime? = null, + + @ApiModelProperty(example = "null", value = "Order Status") + @get:JsonProperty("status") val status: Order.Status? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("complete") val complete: kotlin.Boolean? = false +) : Serializable { + + /** + * Order Status + * Values: placed,approved,delivered + */ + enum class Status(@get:JsonValue val value: kotlin.String) { + + placed("placed"), + approved("approved"), + delivered("delivered"); + + companion object { + @JvmStatic + @JsonCreator + fun forValue(value: kotlin.String): Status { + return values().firstOrNull{it -> it.value == value} + ?: throw IllegalArgumentException("Unexpected value '$value' for enum 'Order'") + } + } + } + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Pet.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Pet.kt new file mode 100644 index 000000000000..0303d2d9d3d2 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Pet.kt @@ -0,0 +1,78 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonCreator +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.annotation.JsonValue +import org.openapitools.model.Category +import org.openapitools.model.Tag +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * A pet for sale in the pet store + * @param name + * @param photoUrls + * @param id + * @param category + * @param tags + * @param status pet status in the store + */ +data class Pet( + + @ApiModelProperty(example = "doggie", required = true, value = "") + @get:JsonProperty("name", required = true) val name: kotlin.String, + + @ApiModelProperty(example = "null", required = true, value = "") + @get:JsonProperty("photoUrls", required = true) val photoUrls: kotlin.collections.List, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @field:Valid + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("category") val category: Category? = null, + + @field:Valid + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("tags") val tags: kotlin.collections.List? = null, + + @ApiModelProperty(example = "null", value = "pet status in the store") + @get:JsonProperty("status") val status: Pet.Status? = null +) : Serializable { + + /** + * pet status in the store + * Values: available,pending,sold + */ + enum class Status(@get:JsonValue val value: kotlin.String) { + + available("available"), + pending("pending"), + sold("sold"); + + companion object { + @JvmStatic + @JsonCreator + fun forValue(value: kotlin.String): Status { + return values().firstOrNull{it -> it.value == value} + ?: throw IllegalArgumentException("Unexpected value '$value' for enum 'Pet'") + } + } + } + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Tag.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Tag.kt new file mode 100644 index 000000000000..d8a5928093c7 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/Tag.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * A tag for a pet + * @param id + * @param name + */ +data class Tag( + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("name") val name: kotlin.String? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/User.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/User.kt new file mode 100644 index 000000000000..8d982852e321 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/kotlin/org/openapitools/model/User.kt @@ -0,0 +1,60 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * A User who is purchasing from the pet store + * @param id + * @param username + * @param firstName + * @param lastName + * @param email + * @param password + * @param phone + * @param userStatus User Status + */ +data class User( + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("id") val id: kotlin.Long? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("username") val username: kotlin.String? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("firstName") val firstName: kotlin.String? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("lastName") val lastName: kotlin.String? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("email") val email: kotlin.String? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("password") val password: kotlin.String? = null, + + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("phone") val phone: kotlin.String? = null, + + @ApiModelProperty(example = "null", value = "User Status") + @get:JsonProperty("userStatus") val userStatus: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/resources/application.yaml b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/resources/application.yaml new file mode 100644 index 000000000000..8e2ebcde976d --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/resources/application.yaml @@ -0,0 +1,10 @@ +spring: + application: + name: openAPIPetstore + + jackson: + serialization: + WRITE_DATES_AS_TIMESTAMPS: false + +server: + port: 8080 diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/resources/openapi.yaml b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/resources/openapi.yaml new file mode 100644 index 000000000000..e06418a039f3 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/main/resources/openapi.yaml @@ -0,0 +1,1060 @@ +openapi: 3.0.1 +info: + description: "This is a sample server Petstore server. For this sample, you can\ + \ use the api key `special-key` to test the authorization filters." + license: + name: Apache-2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + title: OpenAPI Petstore + version: 1.0.0 +servers: +- url: http://petstore.swagger.io/v2 +tags: +- description: Everything about your Pets + name: pet +- description: Access to Petstore orders + name: store +- description: Operations about user + name: user +paths: + /pet: + post: + operationId: addPet + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Pet" + application/xml: + schema: + $ref: "#/components/schemas/Pet" + description: Pet object that needs to be added to the store + required: true + responses: + "405": + content: {} + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + summary: Add a new pet to the store + tags: + - pet tag + x-codegen-request-body-name: body + put: + operationId: updatePet + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Pet" + application/xml: + schema: + $ref: "#/components/schemas/Pet" + description: Pet object that needs to be added to the store + required: true + responses: + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Pet not found + "405": + content: {} + description: Validation exception + security: + - petstore_auth: + - write:pets + - read:pets + summary: Update an existing pet + tags: + - pet tag + x-codegen-request-body-name: body + /pet/findByStatus: + get: + description: Multiple status values can be provided with comma separated strings + operationId: findPetsByStatus + parameters: + - description: Status values that need to be considered for filter + explode: false + in: query + name: status + required: true + schema: + items: + default: available + enum: + - available + - pending + - sold + type: string + type: array + style: form + responses: + "200": + content: + application/xml: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + application/json: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + description: successful operation + "400": + content: {} + description: Invalid status value + security: + - petstore_auth: + - write:pets + - read:pets + summary: Finds Pets by status + tags: + - pet tag + x-spring-paginated: true + /pet/findByTags: + get: + deprecated: true + description: "Multiple tags can be provided with comma separated strings. Use\ + \ tag1, tag2, tag3 for testing." + operationId: findPetsByTags + parameters: + - description: Tags to filter by + explode: false + in: query + name: tags + required: true + schema: + items: + type: string + type: array + style: form + responses: + "200": + content: + application/xml: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + application/json: + schema: + items: + $ref: "#/components/schemas/Pet" + type: array + description: successful operation + "400": + content: {} + description: Invalid tag value + security: + - petstore_auth: + - write:pets + - read:pets + summary: Finds Pets by tags + tags: + - pet tag + x-spring-paginated: true + /pet/{petId}: + delete: + operationId: deletePet + parameters: + - explode: false + in: header + name: api_key + required: false + schema: + type: string + style: simple + - description: Pet id to delete + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + responses: + "400": + content: {} + description: Invalid pet value + security: + - petstore_auth: + - write:pets + - read:pets + summary: Deletes a pet + tags: + - pet tag + get: + description: Returns a single pet + operationId: getPetById + parameters: + - description: ID of pet to return + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Pet" + application/json: + schema: + $ref: "#/components/schemas/Pet" + description: successful operation + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Pet not found + security: + - api_key: [] + summary: Find pet by ID + tags: + - pet tag + post: + operationId: updatePetWithForm + parameters: + - description: ID of pet that needs to be updated + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/updatePetWithForm_request" + responses: + "405": + content: {} + description: Invalid input + security: + - petstore_auth: + - write:pets + - read:pets + summary: Updates a pet in the store with form data + tags: + - pet tag + /pet/{petId}/uploadImage: + post: + operationId: uploadFile + parameters: + - description: ID of pet to update + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + requestBody: + content: + multipart/form-data: + schema: + $ref: "#/components/schemas/uploadFile_request" + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/ApiResponse" + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: uploads an image + tags: + - pet tag + /pet/{petId}/uploadMultipleImage: + post: + operationId: uploadMultipleFile + parameters: + - description: ID of pet to update + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + requestBody: + content: + multipart/form-data: + schema: + $ref: "#/components/schemas/uploadMultipleFile_request" + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/ApiResponse" + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: uploads multiple images + tags: + - pet tag + /pet/{petId}/getImage: + get: + operationId: getImage + parameters: + - description: ID of pet to get image + explode: false + in: path + name: petId + required: true + schema: + format: int64 + type: integer + style: simple + responses: + "200": + content: + application/octet-stream: + schema: + format: binary + type: string + description: successful operation + security: + - petstore_auth: + - write:pets + - read:pets + summary: Get an image + tags: + - pet tag + /store/inventory: + get: + description: Returns a map of status codes to quantities + operationId: getInventory + responses: + "200": + content: + application/json: + schema: + additionalProperties: + format: int32 + type: integer + type: object + description: successful operation + security: + - api_key: [] + summary: Returns pet inventories by status + tags: + - store tag + /store/order: + post: + operationId: placeOrder + requestBody: + content: + '*/*': + schema: + $ref: "#/components/schemas/Order" + description: order placed for purchasing the pet + required: true + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Order" + application/json: + schema: + $ref: "#/components/schemas/Order" + description: successful operation + "400": + content: {} + description: Invalid Order + summary: Place an order for a pet + tags: + - store tag + x-codegen-request-body-name: body + /store/order/{orderId}: + delete: + description: For valid response try integer IDs with value < 1000. Anything + above 1000 or nonintegers will generate API errors + operationId: deleteOrder + parameters: + - description: ID of the order that needs to be deleted + explode: false + in: path + name: orderId + required: true + schema: + type: string + style: simple + responses: + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Order not found + summary: Delete purchase order by ID + tags: + - store tag + get: + description: For valid response try integer IDs with value <= 5 or > 10. Other + values will generate exceptions + operationId: getOrderById + parameters: + - description: ID of pet that needs to be fetched + explode: false + in: path + name: orderId + required: true + schema: + format: int64 + maximum: 5 + minimum: 1 + type: integer + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/Order" + application/json: + schema: + $ref: "#/components/schemas/Order" + description: successful operation + "400": + content: {} + description: Invalid ID supplied + "404": + content: {} + description: Order not found + summary: Find purchase order by ID + tags: + - store tag + /user: + post: + description: This can only be done by the logged in user. + operationId: createUser + requestBody: + content: + '*/*': + schema: + $ref: "#/components/schemas/User" + description: Created user object + required: true + responses: + default: + content: {} + description: successful operation + summary: Create user + tags: + - user tag + x-codegen-request-body-name: body + /user/createWithArray: + post: + operationId: createUsersWithArrayInput + requestBody: + content: + '*/*': + schema: + items: + $ref: "#/components/schemas/User" + type: array + description: List of user object + required: true + responses: + default: + content: {} + description: successful operation + summary: Creates list of users with given input array + tags: + - user tag + x-codegen-request-body-name: body + /user/createWithList: + post: + operationId: createUsersWithListInput + requestBody: + content: + '*/*': + schema: + items: + $ref: "#/components/schemas/User" + type: array + description: List of user object + required: true + responses: + default: + content: {} + description: successful operation + summary: Creates list of users with given input array + tags: + - user tag + x-codegen-request-body-name: body + /user/login: + get: + operationId: loginUser + parameters: + - description: The user name for login + explode: true + in: query + name: username + required: true + schema: + type: string + style: form + - description: The password for login in clear text + explode: true + in: query + name: password + required: true + schema: + type: string + style: form + responses: + "200": + content: + application/xml: + schema: + type: string + application/json: + schema: + type: string + description: successful operation + headers: + X-Rate-Limit: + description: calls per hour allowed by the user + explode: false + schema: + format: int32 + type: integer + style: simple + X-Expires-After: + description: date in UTC when token expires + explode: false + schema: + format: date-time + type: string + style: simple + "400": + content: {} + description: Invalid username/password supplied + summary: Logs user into the system + tags: + - user tag + /user/logout: + get: + operationId: logoutUser + responses: + default: + content: {} + description: successful operation + summary: Logs out current logged in user session + tags: + - user tag + options: + operationId: logoutUserOptions + responses: + default: + content: {} + description: endpoint configuration response + summary: logoutUserOptions + tags: + - user tag + /user/{username}: + delete: + description: This can only be done by the logged in user. + operationId: deleteUser + parameters: + - description: The name that needs to be deleted + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + responses: + "400": + content: {} + description: Invalid username supplied + "404": + content: {} + description: User not found + summary: Delete user + tags: + - user tag + get: + operationId: getUserByName + parameters: + - description: The name that needs to be fetched. Use user1 for testing. + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + responses: + "200": + content: + application/xml: + schema: + $ref: "#/components/schemas/User" + application/json: + schema: + $ref: "#/components/schemas/User" + description: successful operation + "400": + content: {} + description: Invalid username supplied + "404": + content: {} + description: User not found + summary: Get user by user name + tags: + - user tag + put: + description: This can only be done by the logged in user. + operationId: updateUser + parameters: + - description: name that need to be deleted + explode: false + in: path + name: username + required: true + schema: + type: string + style: simple + requestBody: + content: + '*/*': + schema: + $ref: "#/components/schemas/User" + description: Updated user object + required: true + responses: + "400": + content: {} + description: Invalid user supplied + "404": + content: {} + description: User not found + summary: Updated user + tags: + - user tag + x-codegen-request-body-name: body + /items/{item$Id}/something/{item$SubId}: + get: + description: SQ = "; SBS = \; DBS = \\; SD = $some + parameters: + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: path + name: item$Id + required: true + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: path + name: item$SubId + required: true + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: query + name: filter$Type + required: false + schema: + default: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: query + name: filter$SubType + required: false + schema: + default: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: header + name: X-Custom_Header + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: header + name: X-Custom_Header_two + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: cookie + name: session$Token + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: true + in: cookie + name: session$TokenTwo + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: form + responses: + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/_items__item_Id__something__item_SubId__get_200_response" + description: SQ = "; SBS = \; DBS = \\; SD = $some + summary: SQ = "; SBS = \; DBS = \\; SD = $some + /items: + post: + description: SQ = "; SBS = \; DBS = \\; SD = $some + parameters: + - description: SQ = "; SBS = \; DBS = \\; SD = $some + explode: false + in: header + name: X-Post_Header + required: false + schema: + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + style: simple + requestBody: + content: + application/x-www-form-urlencoded: + schema: + $ref: "#/components/schemas/_items_post_request" + required: true + responses: + "201": + content: + application/json: + schema: + $ref: "#/components/schemas/ItemWithDollarAttributesAndExamples" + description: SQ = "; SBS = \; DBS = \\; SD = $some + summary: SQ = "; SBS = \; DBS = \\; SD = $some +components: + schemas: + Order: + description: An order for a pets from the pet store + example: + petId: 6 + quantity: 1 + id: 0 + shipDate: 2000-01-23T04:56:07.000+00:00 + complete: false + status: placed + properties: + id: + format: int64 + type: integer + petId: + format: int64 + type: integer + quantity: + format: int32 + type: integer + shipDate: + format: date-time + type: string + status: + description: Order Status + enum: + - placed + - approved + - delivered + type: string + complete: + default: false + type: boolean + title: Pet Order + type: object + xml: + name: Order + Category: + description: A category for a pet + example: + name: name + id: 6 + properties: + id: + format: int64 + type: integer + name: + type: string + title: Pet category + type: object + xml: + name: Category + User: + description: A User who is purchasing from the pet store + example: + firstName: firstName + lastName: lastName + password: password + userStatus: 6 + phone: phone + id: 0 + email: email + username: username + properties: + id: + format: int64 + type: integer + username: + type: string + firstName: + type: string + lastName: + type: string + email: + type: string + password: + type: string + phone: + type: string + userStatus: + description: User Status + format: int32 + type: integer + title: a User + type: object + xml: + name: User + Tag: + description: A tag for a pet + example: + name: name + id: 1 + properties: + id: + format: int64 + type: integer + name: + type: string + title: Pet Tag + type: object + xml: + name: Tag + Pet: + description: A pet for sale in the pet store + example: + photoUrls: + - photoUrls + - photoUrls + name: doggie + id: 0 + category: + name: name + id: 6 + tags: + - name: name + id: 1 + - name: name + id: 1 + status: available + properties: + id: + format: int64 + type: integer + category: + $ref: "#/components/schemas/Category" + name: + example: doggie + type: string + photoUrls: + items: + type: string + type: array + xml: + name: photoUrl + wrapped: true + tags: + items: + $ref: "#/components/schemas/Tag" + type: array + xml: + name: tag + wrapped: true + status: + description: pet status in the store + enum: + - available + - pending + - sold + type: string + required: + - name + - photoUrls + title: a Pet + type: object + xml: + name: Pet + ApiResponse: + description: Describes the result of uploading an image resource + example: + code: 0 + type: type + message: message + properties: + code: + format: int32 + type: integer + type: + type: string + message: + type: string + title: An uploaded response + type: object + ItemWithDollarAttributesAndExamples: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: + $name: SQ = "; SBS = \; DBS = \\; SD = $some + $id: SQ = "; SBS = \; DBS = \\; SD = $some + properties: + $id: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + $name: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + type: object + updatePetWithForm_request: + properties: + name: + description: Updated name of the pet + type: string + status: + description: Updated status of the pet + type: string + uploadFile_request: + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + image: + description: image to upload + format: binary + type: string + required: + - image + uploadMultipleFile_request: + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + images: + items: + description: image to upload + format: binary + type: string + type: array + required: + - images + _items__item_Id__something__item_SubId__get_200_response_details_Info: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: + detail$One: SQ = "; SBS = \; DBS = \\; SD = $some + detail$Two: 42 + properties: + detail$One: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + detail$Two: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: 42 + type: integer + type: object + _items__item_Id__something__item_SubId__get_200_response: + example: + name$Value: SQ = "; SBS = \; DBS = \\; SD = $some + details$Info: + detail$One: SQ = "; SBS = \; DBS = \\; SD = $some + detail$Two: 42 + item$Id: SQ = "; SBS = \; DBS = \\; SD = $some + properties: + item$Id: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + name$Value: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + details$Info: + $ref: "#/components/schemas/_items__item_Id__something__item_SubId__get_200_response_details_Info" + type: object + _items_post_request: + properties: + form$Name: + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + form$Value: + default: SQ = "; SBS = \; DBS = \\; SD = $some + description: SQ = "; SBS = \; DBS = \\; SD = $some + example: SQ = "; SBS = \; DBS = \\; SD = $some + type: string + type: object + securitySchemes: + petstore_auth: + flows: + implicit: + authorizationUrl: http://petstore.swagger.io/api/oauth/dialog + scopes: + write:pets: modify pets in your account + read:pets: read your pets + type: oauth2 + api_key: + in: header + name: api_key + type: apiKey diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt new file mode 100644 index 000000000000..b9dd52637709 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt @@ -0,0 +1,51 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class ItemsApiTest { + + private val service: ItemsApiService = ItemsApiServiceImpl() + private val api: ItemsApiController = ItemsApiController(service) + + /** + * To test ItemsApiController.itemsItemIdSomethingItemSubIdGet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun itemsItemIdSomethingItemSubIdGetTest() { + val itemDollarId: kotlin.String = TODO() + val itemDollarSubId: kotlin.String = TODO() + val filterDollarType: kotlin.String = TODO() + val filterDollarSubType: kotlin.String = TODO() + val xCustomHeader: kotlin.String? = TODO() + val xCustomHeaderTwo: kotlin.String? = TODO() + val sessionDollarToken: kotlin.String? = TODO() + val sessionDollarTokenTwo: kotlin.String? = TODO() + + val response: ResponseEntity = api.itemsItemIdSomethingItemSubIdGet(itemDollarId, itemDollarSubId, filterDollarType, filterDollarSubType, xCustomHeader, xCustomHeaderTwo, sessionDollarToken, sessionDollarTokenTwo) + + // TODO: test validations + } + + /** + * To test ItemsApiController.itemsPost + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun itemsPostTest() { + val xPostHeader: kotlin.String? = TODO() + val formDollarName: kotlin.String? = TODO() + val formDollarValue: kotlin.String = TODO() + + val response: ResponseEntity = api.itemsPost(xPostHeader, formDollarName, formDollarValue) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/PetApiTest.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/PetApiTest.kt new file mode 100644 index 000000000000..2e469407743c --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/PetApiTest.kt @@ -0,0 +1,169 @@ +package org.openapitools.api + +import org.openapitools.model.ModelApiResponse +import org.openapitools.model.Pet +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class PetApiTest { + + private val service: PetApiService = PetApiServiceImpl() + private val api: PetApiController = PetApiController(service) + + /** + * To test PetApiController.addPet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun addPetTest() { + val body: Pet = TODO() + + val response: ResponseEntity = api.addPet(body) + + // TODO: test validations + } + + /** + * To test PetApiController.deletePet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun deletePetTest() { + val petId: kotlin.Long = TODO() + val apiKey: kotlin.String? = TODO() + + val response: ResponseEntity = api.deletePet(petId, apiKey) + + // TODO: test validations + } + + /** + * To test PetApiController.findPetsByStatus + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun findPetsByStatusTest() { + val status: kotlin.collections.List = TODO() + + val response: ResponseEntity> = api.findPetsByStatus(status) + + // TODO: test validations + } + + /** + * To test PetApiController.findPetsByTags + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun findPetsByTagsTest() { + val tags: kotlin.collections.List = TODO() + + val response: ResponseEntity> = api.findPetsByTags(tags) + + // TODO: test validations + } + + /** + * To test PetApiController.getImage + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getImageTest() { + val petId: kotlin.Long = TODO() + + val response: ResponseEntity = api.getImage(petId) + + // TODO: test validations + } + + /** + * To test PetApiController.getPetById + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getPetByIdTest() { + val petId: kotlin.Long = TODO() + + val response: ResponseEntity = api.getPetById(petId) + + // TODO: test validations + } + + /** + * To test PetApiController.updatePet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun updatePetTest() { + val body: Pet = TODO() + + val response: ResponseEntity = api.updatePet(body) + + // TODO: test validations + } + + /** + * To test PetApiController.updatePetWithForm + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun updatePetWithFormTest() { + val petId: kotlin.Long = TODO() + val name: kotlin.String? = TODO() + val status: kotlin.String? = TODO() + + val response: ResponseEntity = api.updatePetWithForm(petId, name, status) + + // TODO: test validations + } + + /** + * To test PetApiController.uploadFile + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun uploadFileTest() { + val petId: kotlin.Long = TODO() + val image: org.springframework.web.multipart.MultipartFile = TODO() + val additionalMetadata: kotlin.String? = TODO() + + val response: ResponseEntity = api.uploadFile(petId, image, additionalMetadata) + + // TODO: test validations + } + + /** + * To test PetApiController.uploadMultipleFile + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun uploadMultipleFileTest() { + val petId: kotlin.Long = TODO() + val images: Array = TODO() + val additionalMetadata: kotlin.String? = TODO() + + val response: ResponseEntity = api.uploadMultipleFile(petId, images, additionalMetadata) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/StoreApiTest.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/StoreApiTest.kt new file mode 100644 index 000000000000..b67568e31dab --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/StoreApiTest.kt @@ -0,0 +1,70 @@ +package org.openapitools.api + +import org.openapitools.model.Order +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class StoreApiTest { + + private val service: StoreApiService = StoreApiServiceImpl() + private val api: StoreApiController = StoreApiController(service) + + /** + * To test StoreApiController.deleteOrder + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun deleteOrderTest() { + val orderId: kotlin.String = TODO() + + val response: ResponseEntity = api.deleteOrder(orderId) + + // TODO: test validations + } + + /** + * To test StoreApiController.getInventory + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getInventoryTest() { + + val response: ResponseEntity> = api.getInventory() + + // TODO: test validations + } + + /** + * To test StoreApiController.getOrderById + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getOrderByIdTest() { + val orderId: kotlin.Long = TODO() + + val response: ResponseEntity = api.getOrderById(orderId) + + // TODO: test validations + } + + /** + * To test StoreApiController.placeOrder + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun placeOrderTest() { + val body: Order = TODO() + + val response: ResponseEntity = api.placeOrder(body) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/UserApiTest.kt b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/UserApiTest.kt new file mode 100644 index 000000000000..d7f7e9523f5f --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-dollar-issue-swagger1/src/test/kotlin/org/openapitools/api/UserApiTest.kt @@ -0,0 +1,146 @@ +package org.openapitools.api + +import org.openapitools.model.User +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class UserApiTest { + + private val service: UserApiService = UserApiServiceImpl() + private val api: UserApiController = UserApiController(service) + + /** + * To test UserApiController.createUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun createUserTest() { + val body: User = TODO() + + val response: ResponseEntity = api.createUser(body) + + // TODO: test validations + } + + /** + * To test UserApiController.createUsersWithArrayInput + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun createUsersWithArrayInputTest() { + val body: kotlin.collections.List = TODO() + + val response: ResponseEntity = api.createUsersWithArrayInput(body) + + // TODO: test validations + } + + /** + * To test UserApiController.createUsersWithListInput + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun createUsersWithListInputTest() { + val body: kotlin.collections.List = TODO() + + val response: ResponseEntity = api.createUsersWithListInput(body) + + // TODO: test validations + } + + /** + * To test UserApiController.deleteUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun deleteUserTest() { + val username: kotlin.String = TODO() + + val response: ResponseEntity = api.deleteUser(username) + + // TODO: test validations + } + + /** + * To test UserApiController.getUserByName + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun getUserByNameTest() { + val username: kotlin.String = TODO() + + val response: ResponseEntity = api.getUserByName(username) + + // TODO: test validations + } + + /** + * To test UserApiController.loginUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun loginUserTest() { + val username: kotlin.String = TODO() + val password: kotlin.String = TODO() + + val response: ResponseEntity = api.loginUser(username, password) + + // TODO: test validations + } + + /** + * To test UserApiController.logoutUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun logoutUserTest() { + + val response: ResponseEntity = api.logoutUser() + + // TODO: test validations + } + + /** + * To test UserApiController.logoutUserOptions + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun logoutUserOptionsTest() { + + val response: ResponseEntity = api.logoutUserOptions() + + // TODO: test validations + } + + /** + * To test UserApiController.updateUser + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun updateUserTest() { + val username: kotlin.String = TODO() + val body: User = TODO() + + val response: ResponseEntity = api.updateUser(username, body) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/.openapi-generator/FILES index 8b73d6497e4f..3cd6745be096 100644 --- a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/.openapi-generator/FILES @@ -8,6 +8,9 @@ pom.xml settings.gradle src/main/kotlin/org/openapitools/Application.kt src/main/kotlin/org/openapitools/api/ApiUtil.kt +src/main/kotlin/org/openapitools/api/ItemsApi.kt +src/main/kotlin/org/openapitools/api/ItemsApiController.kt +src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt src/main/kotlin/org/openapitools/api/PetApi.kt src/main/kotlin/org/openapitools/api/PetApiController.kt src/main/kotlin/org/openapitools/api/PetApiDelegate.kt @@ -22,6 +25,9 @@ src/main/kotlin/org/openapitools/model/Cat.kt src/main/kotlin/org/openapitools/model/Category.kt src/main/kotlin/org/openapitools/model/Color.kt src/main/kotlin/org/openapitools/model/Dog.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt src/main/kotlin/org/openapitools/model/ModelApiResponse.kt src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt new file mode 100644 index 000000000000..a302ce3cea83 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApi.kt @@ -0,0 +1,106 @@ +/** + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). + * https://openapi-generator.tech + * Do not edit the class manually. +*/ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired + +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid + +import kotlinx.coroutines.flow.Flow +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "items", description = "The items API") +interface ItemsApi { + + fun getDelegate(): ItemsApiDelegate + + + @ApiOperation( + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + nickname = "itemsItemIdSomethingItemSubIdGet", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + response = ItemsItemIdSomethingItemSubIdGet200Response::class + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemsItemIdSomethingItemSubIdGet200Response::class)] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item$Id}/something/{item$SubId}" */], + produces = ["application/json"] + ) + suspend fun itemsItemIdSomethingItemSubIdGet( + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String?, + @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange + ): ResponseEntity { + return getDelegate().itemsItemIdSomethingItemSubIdGet(itemDollarId, itemDollarSubId, filterDollarType, filterDollarSubType, xCustomHeader, xCustomHeaderTwo, sessionDollarToken, sessionDollarTokenTwo, exchange) + } + + + @ApiOperation( + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + nickname = "itemsPost", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + response = ItemWithDollarAttributesAndExamples::class + ) + @ApiResponses( + value = [ApiResponse(code = 201, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemWithDollarAttributesAndExamples::class)] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ITEMS_POST /* "/items" */], + produces = ["application/json"], + consumes = ["application/x-www-form-urlencoded"] + ) + suspend fun itemsPost( + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String, + @ApiParam(hidden = true) exchange: org.springframework.web.server.ServerWebExchange + ): ResponseEntity { + return getDelegate().itemsPost(xPostHeader, formDollarName, formDollarValue, exchange) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiController.kt new file mode 100644 index 000000000000..32a891793f22 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -0,0 +1,22 @@ +package org.openapitools.api + +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.RequestMapping +import java.util.Optional +import org.openapitools.api.ItemsApiController.Companion.BASE_PATH + +@javax.annotation.Generated(value = ["org.openapitools.codegen.languages.KotlinSpringServerCodegen"], comments = "Generator version: 7.18.0-SNAPSHOT") +@Controller +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +class ItemsApiController( + private val delegate: ItemsApiDelegate +) : ItemsApi { + + override fun getDelegate(): ItemsApiDelegate = delegate + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + } + +} diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt new file mode 100644 index 000000000000..507e56259ee4 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/api/ItemsApiDelegate.kt @@ -0,0 +1,44 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.web.context.request.NativeWebRequest +import kotlinx.coroutines.flow.Flow + +import java.util.Optional + +/** + * A delegate to be called by the {@link ItemsApiController}}. + * Implement this interface with a {@link org.springframework.stereotype.Service} annotated class. + */ +@javax.annotation.Generated(value = ["org.openapitools.codegen.languages.KotlinSpringServerCodegen"], comments = "Generator version: 7.18.0-SNAPSHOT") +interface ItemsApiDelegate { + + fun getRequest(): Optional = Optional.empty() + + /** + * @see ItemsApi#itemsItemIdSomethingItemSubIdGet + */ + suspend fun itemsItemIdSomethingItemSubIdGet(itemDollarId: kotlin.String, + itemDollarSubId: kotlin.String, + filterDollarType: kotlin.String, + filterDollarSubType: kotlin.String, + xCustomHeader: kotlin.String?, + xCustomHeaderTwo: kotlin.String?, + sessionDollarToken: kotlin.String?, + sessionDollarTokenTwo: kotlin.String?, + exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity + + + /** + * @see ItemsApi#itemsPost + */ + suspend fun itemsPost(xPostHeader: kotlin.String?, + formDollarName: kotlin.String?, + formDollarValue: kotlin.String, + exchange: org.springframework.web.server.ServerWebExchange): ResponseEntity + +} diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..f09c9e4036f2 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..ce959d5caa44 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..f1572d669057 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-include-http-request-context-delegate/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @ApiModelProperty(example = "42", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-modelMutable/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-modelMutable/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot-modelMutable/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-modelMutable/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-no-response-entity-delegate/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-no-response-entity-delegate/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot-no-response-entity-delegate/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-no-response-entity-delegate/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-no-response-entity/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-reactive-without-flow/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-reactive-without-flow/src/main/kotlin/org/openapitools/api/StoreApiService.kt index ca81edd9f2b0..4e35128d4949 100644 --- a/samples/server/petstore/kotlin-springboot-reactive-without-flow/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-reactive-without-flow/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -7,7 +7,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -27,7 +27,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-reactive/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-reactive/src/main/kotlin/org/openapitools/api/StoreApiService.kt index ca81edd9f2b0..4e35128d4949 100644 --- a/samples/server/petstore/kotlin-springboot-reactive/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-reactive/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -7,7 +7,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -27,7 +27,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt index f99b4146027c..ad0ad481db79 100644 --- a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt +++ b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/PetApiController.kt @@ -43,9 +43,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Add a new pet to the store", nickname = "addPet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 405, message = "Invalid input")]) + value = [ApiResponse(code = 405, message = "Invalid input")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_ADD_PET /* "/pet" */], @@ -62,9 +64,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Deletes a pet", nickname = "deletePet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid pet value")]) + value = [ApiResponse(code = 400, message = "Invalid pet value")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_PET /* "/pet/{petId}" */] @@ -83,9 +87,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { notes = "Multiple status values can be provided with comma separated strings", response = Pet::class, responseContainer = "List", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_FIND_PETS_BY_STATUS /* "/pet/findByStatus" */], @@ -104,9 +110,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", response = Pet::class, responseContainer = "List", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_FIND_PETS_BY_TAGS /* "/pet/findByTags" */], @@ -124,9 +132,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { nickname = "getPetById", notes = "Returns a single pet", response = Pet::class, - authorizations = [Authorization(value = "api_key")]) + authorizations = [Authorization(value = "api_key")] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_PET_BY_ID /* "/pet/{petId}" */], @@ -143,9 +153,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Update an existing pet", nickname = "updatePet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")]) + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")] + ) @RequestMapping( method = [RequestMethod.PUT], value = [PATH_UPDATE_PET /* "/pet" */], @@ -162,9 +174,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Updates a pet in the store with form data", nickname = "updatePetWithForm", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 405, message = "Invalid input")]) + value = [ApiResponse(code = 405, message = "Invalid input")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_UPDATE_PET_WITH_FORM /* "/pet/{petId}" */], @@ -184,9 +198,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { nickname = "uploadFile", notes = "", response = ModelApiResponse::class, - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)]) + value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_UPLOAD_FILE /* "/pet/{petId}/uploadImage" */], diff --git a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt index fa400197c7ca..90dfe1ddfe07 100644 --- a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt +++ b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiController.kt @@ -41,9 +41,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic @ApiOperation( value = "Delete purchase order by ID", nickname = "deleteOrder", - notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors") + notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors" + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_ORDER /* "/store/order/{orderId}" */] @@ -61,9 +63,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic notes = "Returns a map of status codes to quantities", response = kotlin.Int::class, responseContainer = "Map", - authorizations = [Authorization(value = "api_key")]) + authorizations = [Authorization(value = "api_key")] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")]) + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_INVENTORY /* "/store/inventory" */], @@ -78,9 +82,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic value = "Find purchase order by ID", nickname = "getOrderById", notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions", - response = Order::class) + response = Order::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_ORDER_BY_ID /* "/store/order/{orderId}" */], @@ -97,9 +103,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic value = "Place an order for a pet", nickname = "placeOrder", notes = "", - response = Order::class) + response = Order::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_PLACE_ORDER /* "/store/order" */], diff --git a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt index cbaedc3d378b..b3c71c688c29 100644 --- a/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt +++ b/samples/server/petstore/kotlin-springboot-source-swagger1/src/main/kotlin/org/openapitools/api/UserApiController.kt @@ -41,9 +41,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Create user", nickname = "createUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USER /* "/user" */] @@ -58,9 +60,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Creates list of users with given input array", nickname = "createUsersWithArrayInput", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USERS_WITH_ARRAY_INPUT /* "/user/createWithArray" */] @@ -75,9 +79,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Creates list of users with given input array", nickname = "createUsersWithListInput", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USERS_WITH_LIST_INPUT /* "/user/createWithList" */] @@ -92,9 +98,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Delete user", nickname = "deleteUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_USER /* "/user/{username}" */] @@ -110,9 +118,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) value = "Get user by user name", nickname = "getUserByName", notes = "", - response = User::class) + response = User::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_USER_BY_NAME /* "/user/{username}" */], @@ -129,9 +139,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) value = "Logs user into the system", nickname = "loginUser", notes = "", - response = kotlin.String::class) + response = kotlin.String::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")]) + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_LOGIN_USER /* "/user/login" */], @@ -148,9 +160,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Logs out current logged in user session", nickname = "logoutUser", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_LOGOUT_USER /* "/user/logout" */] @@ -163,9 +177,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Updated user", nickname = "updateUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.PUT], value = [PATH_UPDATE_USER /* "/user/{username}" */] diff --git a/samples/server/petstore/kotlin-springboot-source-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-source-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot-source-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-source-swagger2/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/PetApiController.kt b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/PetApiController.kt index f99b4146027c..ad0ad481db79 100644 --- a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/PetApiController.kt +++ b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/PetApiController.kt @@ -43,9 +43,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Add a new pet to the store", nickname = "addPet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 405, message = "Invalid input")]) + value = [ApiResponse(code = 405, message = "Invalid input")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_ADD_PET /* "/pet" */], @@ -62,9 +64,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Deletes a pet", nickname = "deletePet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid pet value")]) + value = [ApiResponse(code = 400, message = "Invalid pet value")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_PET /* "/pet/{petId}" */] @@ -83,9 +87,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { notes = "Multiple status values can be provided with comma separated strings", response = Pet::class, responseContainer = "List", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_FIND_PETS_BY_STATUS /* "/pet/findByStatus" */], @@ -104,9 +110,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", response = Pet::class, responseContainer = "List", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_FIND_PETS_BY_TAGS /* "/pet/findByTags" */], @@ -124,9 +132,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { nickname = "getPetById", notes = "Returns a single pet", response = Pet::class, - authorizations = [Authorization(value = "api_key")]) + authorizations = [Authorization(value = "api_key")] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_PET_BY_ID /* "/pet/{petId}" */], @@ -143,9 +153,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Update an existing pet", nickname = "updatePet", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")]) + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")] + ) @RequestMapping( method = [RequestMethod.PUT], value = [PATH_UPDATE_PET /* "/pet" */], @@ -162,9 +174,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { value = "Updates a pet in the store with form data", nickname = "updatePetWithForm", notes = "", - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 405, message = "Invalid input")]) + value = [ApiResponse(code = 405, message = "Invalid input")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_UPDATE_PET_WITH_FORM /* "/pet/{petId}" */], @@ -184,9 +198,11 @@ class PetApiController(@Autowired(required = true) val service: PetApiService) { nickname = "uploadFile", notes = "", response = ModelApiResponse::class, - authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])]) + authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)]) + value = [ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse::class)] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_UPLOAD_FILE /* "/pet/{petId}/uploadImage" */], diff --git a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiController.kt b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiController.kt index fa400197c7ca..90dfe1ddfe07 100644 --- a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiController.kt +++ b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiController.kt @@ -41,9 +41,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic @ApiOperation( value = "Delete purchase order by ID", nickname = "deleteOrder", - notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors") + notes = "For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors" + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_ORDER /* "/store/order/{orderId}" */] @@ -61,9 +63,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic notes = "Returns a map of status codes to quantities", response = kotlin.Int::class, responseContainer = "Map", - authorizations = [Authorization(value = "api_key")]) + authorizations = [Authorization(value = "api_key")] + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")]) + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.collections.Map::class, responseContainer = "Map")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_INVENTORY /* "/store/inventory" */], @@ -78,9 +82,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic value = "Find purchase order by ID", nickname = "getOrderById", notes = "For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions", - response = Order::class) + response = Order::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_ORDER_BY_ID /* "/store/order/{orderId}" */], @@ -97,9 +103,11 @@ class StoreApiController(@Autowired(required = true) val service: StoreApiServic value = "Place an order for a pet", nickname = "placeOrder", notes = "", - response = Order::class) + response = Order::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")]) + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_PLACE_ORDER /* "/store/order" */], diff --git a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200) diff --git a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/UserApiController.kt b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/UserApiController.kt index cbaedc3d378b..b3c71c688c29 100644 --- a/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/UserApiController.kt +++ b/samples/server/petstore/kotlin-springboot-springfox/src/main/kotlin/org/openapitools/api/UserApiController.kt @@ -41,9 +41,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Create user", nickname = "createUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USER /* "/user" */] @@ -58,9 +60,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Creates list of users with given input array", nickname = "createUsersWithArrayInput", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USERS_WITH_ARRAY_INPUT /* "/user/createWithArray" */] @@ -75,9 +79,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Creates list of users with given input array", nickname = "createUsersWithListInput", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.POST], value = [PATH_CREATE_USERS_WITH_LIST_INPUT /* "/user/createWithList" */] @@ -92,9 +98,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Delete user", nickname = "deleteUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.DELETE], value = [PATH_DELETE_USER /* "/user/{username}" */] @@ -110,9 +118,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) value = "Get user by user name", nickname = "getUserByName", notes = "", - response = User::class) + response = User::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_GET_USER_BY_NAME /* "/user/{username}" */], @@ -129,9 +139,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) value = "Logs user into the system", nickname = "loginUser", notes = "", - response = kotlin.String::class) + response = kotlin.String::class + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")]) + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_LOGIN_USER /* "/user/login" */], @@ -148,9 +160,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Logs out current logged in user session", nickname = "logoutUser", - notes = "") + notes = "" + ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation")]) + value = [ApiResponse(code = 200, message = "successful operation")] + ) @RequestMapping( method = [RequestMethod.GET], value = [PATH_LOGOUT_USER /* "/user/logout" */] @@ -163,9 +177,11 @@ class UserApiController(@Autowired(required = true) val service: UserApiService) @ApiOperation( value = "Updated user", nickname = "updateUser", - notes = "This can only be done by the logged in user.") + notes = "This can only be done by the logged in user." + ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")]) + value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")] + ) @RequestMapping( method = [RequestMethod.PUT], value = [PATH_UPDATE_USER /* "/user/{username}" */] diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES index 59aed4399e9f..14defc430ae5 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/.openapi-generator/FILES @@ -6,18 +6,24 @@ gradlew gradlew.bat pom.xml settings.gradle +src/main/kotlin/org/openapitools/Application.kt src/main/kotlin/org/openapitools/api/ApiUtil.kt src/main/kotlin/org/openapitools/api/Exceptions.kt -src/main/kotlin/org/openapitools/api/PetApi.kt -src/main/kotlin/org/openapitools/api/StoreApi.kt -src/main/kotlin/org/openapitools/api/UserApi.kt +src/main/kotlin/org/openapitools/api/ItemsApiController.kt +src/main/kotlin/org/openapitools/api/PetApiController.kt +src/main/kotlin/org/openapitools/api/StoreApiController.kt +src/main/kotlin/org/openapitools/api/UserApiController.kt src/main/kotlin/org/openapitools/configuration/EnumConverterConfiguration.kt src/main/kotlin/org/openapitools/model/Cat.kt src/main/kotlin/org/openapitools/model/Category.kt src/main/kotlin/org/openapitools/model/Color.kt src/main/kotlin/org/openapitools/model/Dog.kt +src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt +src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt src/main/kotlin/org/openapitools/model/ModelApiResponse.kt src/main/kotlin/org/openapitools/model/Order.kt src/main/kotlin/org/openapitools/model/Pet.kt src/main/kotlin/org/openapitools/model/Tag.kt src/main/kotlin/org/openapitools/model/User.kt +src/main/resources/application.yaml diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/build.gradle.kts b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/build.gradle.kts index 10a80f14f0ff..70561b9c46ef 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/build.gradle.kts +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/build.gradle.kts @@ -20,10 +20,6 @@ tasks.withType { kotlinOptions.jvmTarget = "11" } -tasks.bootJar { - enabled = false -} - plugins { val kotlinVersion = "1.9.25" id("org.jetbrains.kotlin.jvm") version kotlinVersion diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/pom.xml b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/pom.xml index 067cb2bbd025..afa447d2d2a4 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/pom.xml +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/pom.xml @@ -24,17 +24,17 @@ ${project.basedir}/src/test/kotlin - org.apache.maven.plugins - maven-source-plugin + org.springframework.boot + spring-boot-maven-plugin - attach-sources - jar + repackage + kotlin-maven-plugin org.jetbrains.kotlin diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/Application.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/Application.kt new file mode 100644 index 000000000000..2fe6de62479e --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/Application.kt @@ -0,0 +1,13 @@ +package org.openapitools + +import org.springframework.boot.runApplication +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.context.annotation.ComponentScan + +@SpringBootApplication +@ComponentScan(basePackages = ["org.openapitools", "org.openapitools.api", "org.openapitools.model"]) +class Application + +fun main(args: Array) { + runApplication(*args) +} diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt new file mode 100644 index 000000000000..457d0e7251ed --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/ItemsApiController.kt @@ -0,0 +1,101 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200Response +import io.swagger.annotations.Api +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiParam +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.ApiResponses +import io.swagger.annotations.Authorization +import io.swagger.annotations.AuthorizationScope +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity + +import org.springframework.web.bind.annotation.* +import org.springframework.validation.annotation.Validated +import org.springframework.web.context.request.NativeWebRequest +import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.ItemsApiController.Companion.BASE_PATH + +import javax.validation.Valid +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size + +import kotlin.collections.List +import kotlin.collections.Map + +@RestController +@Validated +@Api(value = "items", description = "The items API") +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +class ItemsApiController() { + + + @ApiOperation( + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + nickname = "itemsItemIdSomethingItemSubIdGet", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + response = ItemsItemIdSomethingItemSubIdGet200Response::class + ) + @ApiResponses( + value = [ApiResponse(code = 200, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemsItemIdSomethingItemSubIdGet200Response::class)] + ) + @RequestMapping( + method = [RequestMethod.GET], + value = [PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET /* "/items/{item$Id}/something/{item$SubId}" */], + produces = ["application/json"] + ) + fun itemsItemIdSomethingItemSubIdGet( + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$Id") itemDollarId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", required = true) @PathVariable("item\$SubId") itemDollarSubId: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "filter\$Type", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "filter\$SubType", required = false, defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") filterDollarSubType: kotlin.String, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header", required = false) xCustomHeader: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Custom_Header_two", required = false) xCustomHeaderTwo: kotlin.String?, + @CookieValue(name = "session\$Token", required = false) sessionDollarToken: kotlin.String?, + @CookieValue(name = "session\$TokenTwo", required = false) sessionDollarTokenTwo: kotlin.String?, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + + @ApiOperation( + value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + nickname = "itemsPost", + notes = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + response = ItemWithDollarAttributesAndExamples::class + ) + @ApiResponses( + value = [ApiResponse(code = 201, message = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", response = ItemWithDollarAttributesAndExamples::class)] + ) + @RequestMapping( + method = [RequestMethod.POST], + value = [PATH_ITEMS_POST /* "/items" */], + produces = ["application/json"], + consumes = ["application/x-www-form-urlencoded"] + ) + fun itemsPost( + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @RequestHeader(value = "X-Post_Header", required = false) xPostHeader: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Name", required = false) formDollarName: kotlin.String?, + @ApiParam(value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", defaultValue = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") @Valid @RequestParam(value = "form\$Value", required = false) formDollarValue: kotlin.String, + @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } + + companion object { + //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" + const val PATH_ITEMS_ITEM_ID_SOMETHING_ITEM_SUB_ID_GET: String = "/items/{item\$Id}/something/{item\$SubId}" + const val PATH_ITEMS_POST: String = "/items" + } +} diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApi.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApiController.kt similarity index 86% rename from samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApi.kt rename to samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApiController.kt index 74927d98aeb4..d2bd3af5781f 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApi.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/PetApiController.kt @@ -1,8 +1,3 @@ -/** - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). - * https://openapi-generator.tech - * Do not edit the class manually. -*/ package org.openapitools.api import org.openapitools.model.ModelApiResponse @@ -22,7 +17,9 @@ import org.springframework.web.bind.annotation.* import org.springframework.validation.annotation.Validated import org.springframework.web.context.request.NativeWebRequest import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.PetApiController.Companion.BASE_PATH +import javax.validation.Valid import javax.validation.constraints.DecimalMax import javax.validation.constraints.DecimalMin import javax.validation.constraints.Email @@ -31,7 +28,6 @@ import javax.validation.constraints.Min import javax.validation.constraints.NotNull import javax.validation.constraints.Pattern import javax.validation.constraints.Size -import javax.validation.Valid import kotlin.collections.List import kotlin.collections.Map @@ -39,7 +35,8 @@ import kotlin.collections.Map @RestController @Validated @Api(value = "pet", description = "The pet API") -interface PetApi { +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +class PetApiController() { @ApiOperation( @@ -59,7 +56,9 @@ interface PetApi { fun addPet( @ApiParam(value = "", required = true) @Valid @RequestBody pet: Pet, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -79,7 +78,9 @@ interface PetApi { @ApiParam(value = "Pet id to delete", required = true) @PathVariable("petId") petId: kotlin.Long, @ApiParam(value = "") @RequestHeader(value = "api_key", required = false) apiKey: kotlin.String?, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -91,7 +92,7 @@ interface PetApi { authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"), ApiResponse(code = 400, message = "Invalid status value")] + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid status value")] ) @RequestMapping( method = [RequestMethod.GET], @@ -101,7 +102,9 @@ interface PetApi { fun findPetsByStatus( @NotNull @ApiParam(value = "Status values that need to be considered for filter", required = true, allowableValues = "available, pending, sold") @Valid @RequestParam(value = "status", required = true) status: kotlin.collections.List, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity> + ): ResponseEntity> { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -113,7 +116,7 @@ interface PetApi { authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"), ApiResponse(code = 400, message = "Invalid tag value")] + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class, responseContainer = "List"),ApiResponse(code = 400, message = "Invalid tag value")] ) @RequestMapping( method = [RequestMethod.GET], @@ -123,7 +126,9 @@ interface PetApi { fun findPetsByTags( @NotNull @ApiParam(value = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) tags: kotlin.collections.List, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity> + ): ResponseEntity> { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -134,7 +139,7 @@ interface PetApi { authorizations = [Authorization(value = "api_key")] ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class), ApiResponse(code = 400, message = "Invalid ID supplied"), ApiResponse(code = 404, message = "Pet not found")] + value = [ApiResponse(code = 200, message = "successful operation", response = Pet::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found")] ) @RequestMapping( method = [RequestMethod.GET], @@ -144,7 +149,9 @@ interface PetApi { fun getPetById( @ApiParam(value = "ID of pet to return", required = true) @PathVariable("petId") petId: kotlin.Long, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -154,7 +161,7 @@ interface PetApi { authorizations = [Authorization(value = "petstore_auth", scopes = [AuthorizationScope(scope = "write:pets", description = "modify pets in your account"), AuthorizationScope(scope = "read:pets", description = "read your pets")])] ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"), ApiResponse(code = 404, message = "Pet not found"), ApiResponse(code = 405, message = "Validation exception")] + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Pet not found"),ApiResponse(code = 405, message = "Validation exception")] ) @RequestMapping( method = [RequestMethod.PUT], @@ -164,7 +171,9 @@ interface PetApi { fun updatePet( @ApiParam(value = "", required = true) @Valid @RequestBody pet: Pet, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -186,7 +195,9 @@ interface PetApi { @ApiParam(value = "Updated name of the pet") @Valid @RequestParam(value = "name", required = false) name: kotlin.String?, @ApiParam(value = "Updated status of the pet") @Valid @RequestParam(value = "status", required = false) status: kotlin.String?, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -210,10 +221,13 @@ interface PetApi { @ApiParam(value = "") @Valid @RequestParam(value = "additionalMetadata", required = false) additionalMetadata: kotlin.String?, @ApiParam(value = "file detail") @Valid @RequestPart("file", required = false) file: org.springframework.web.multipart.MultipartFile, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } companion object { //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" const val PATH_ADD_PET: String = "/pet" const val PATH_DELETE_PET: String = "/pet/{petId}" const val PATH_FIND_PETS_BY_STATUS: String = "/pet/findByStatus" diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApi.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApiController.kt similarity index 82% rename from samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApi.kt rename to samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApiController.kt index 40c176b58ce1..685b3f1a68aa 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApi.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/StoreApiController.kt @@ -1,8 +1,3 @@ -/** - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). - * https://openapi-generator.tech - * Do not edit the class manually. -*/ package org.openapitools.api import org.openapitools.model.Order @@ -21,7 +16,9 @@ import org.springframework.web.bind.annotation.* import org.springframework.validation.annotation.Validated import org.springframework.web.context.request.NativeWebRequest import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.StoreApiController.Companion.BASE_PATH +import javax.validation.Valid import javax.validation.constraints.DecimalMax import javax.validation.constraints.DecimalMin import javax.validation.constraints.Email @@ -30,7 +27,6 @@ import javax.validation.constraints.Min import javax.validation.constraints.NotNull import javax.validation.constraints.Pattern import javax.validation.constraints.Size -import javax.validation.Valid import kotlin.collections.List import kotlin.collections.Map @@ -38,7 +34,8 @@ import kotlin.collections.Map @RestController @Validated @Api(value = "store", description = "The store API") -interface StoreApi { +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +class StoreApiController() { @ApiOperation( @@ -47,7 +44,7 @@ interface StoreApi { notes = "" ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid ID supplied"), ApiResponse(code = 404, message = "Order not found")] + value = [ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] ) @RequestMapping( method = [RequestMethod.DELETE], @@ -56,7 +53,9 @@ interface StoreApi { fun deleteOrder( @ApiParam(value = "", required = true) @PathVariable("orderId") orderId: kotlin.String, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -75,7 +74,9 @@ interface StoreApi { value = [PATH_GET_INVENTORY /* "/store/inventory" */], produces = ["application/json"] ) - fun getInventory(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity> + fun getInventory(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity> { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -85,7 +86,7 @@ interface StoreApi { response = Order::class ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class), ApiResponse(code = 400, message = "Invalid ID supplied"), ApiResponse(code = 404, message = "Order not found")] + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid ID supplied"),ApiResponse(code = 404, message = "Order not found")] ) @RequestMapping( method = [RequestMethod.GET], @@ -95,7 +96,9 @@ interface StoreApi { fun getOrderById( @Min(value=1) @Max(value=5) @ApiParam(value = "", required = true) @PathVariable("orderId") orderId: kotlin.Int, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -105,7 +108,7 @@ interface StoreApi { response = Order::class ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = Order::class), ApiResponse(code = 400, message = "Invalid Order")] + value = [ApiResponse(code = 200, message = "successful operation", response = Order::class),ApiResponse(code = 400, message = "Invalid Order")] ) @RequestMapping( method = [RequestMethod.POST], @@ -116,10 +119,13 @@ interface StoreApi { fun placeOrder( @ApiParam(value = "", required = true) @Valid @RequestBody order: Order, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } companion object { //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" const val PATH_DELETE_ORDER: String = "/store/order/{orderId}" const val PATH_GET_INVENTORY: String = "/store/inventory" const val PATH_GET_ORDER_BY_ID: String = "/store/order/{orderId}" diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApi.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApiController.kt similarity index 82% rename from samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApi.kt rename to samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApiController.kt index db017f3558b1..f257f0533cc5 100644 --- a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApi.kt +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/api/UserApiController.kt @@ -1,8 +1,3 @@ -/** - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (7.18.0-SNAPSHOT). - * https://openapi-generator.tech - * Do not edit the class manually. -*/ package org.openapitools.api import org.openapitools.model.User @@ -21,7 +16,9 @@ import org.springframework.web.bind.annotation.* import org.springframework.validation.annotation.Validated import org.springframework.web.context.request.NativeWebRequest import org.springframework.beans.factory.annotation.Autowired +import org.openapitools.api.UserApiController.Companion.BASE_PATH +import javax.validation.Valid import javax.validation.constraints.DecimalMax import javax.validation.constraints.DecimalMin import javax.validation.constraints.Email @@ -30,7 +27,6 @@ import javax.validation.constraints.Min import javax.validation.constraints.NotNull import javax.validation.constraints.Pattern import javax.validation.constraints.Size -import javax.validation.Valid import kotlin.collections.List import kotlin.collections.Map @@ -38,7 +34,8 @@ import kotlin.collections.Map @RestController @Validated @Api(value = "user", description = "The user API") -interface UserApi { +@RequestMapping("\${openapi.openAPIPetstore.base-path:\${api.base-path:$BASE_PATH}}") +class UserApiController() { @ApiOperation( @@ -57,7 +54,9 @@ interface UserApi { fun createUser( @ApiParam(value = "", required = true) @Valid @RequestBody user: User, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -76,7 +75,9 @@ interface UserApi { fun createUsersWithArrayInput( @ApiParam(value = "", required = true) @Valid @RequestBody user: kotlin.collections.List, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -95,7 +96,9 @@ interface UserApi { fun createUsersWithListInput( @ApiParam(value = "", required = true) @Valid @RequestBody user: kotlin.collections.List, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -104,7 +107,7 @@ interface UserApi { notes = "" ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid username supplied"), ApiResponse(code = 404, message = "User not found")] + value = [ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] ) @RequestMapping( method = [RequestMethod.DELETE], @@ -113,7 +116,9 @@ interface UserApi { fun deleteUser( @ApiParam(value = "", required = true) @PathVariable("username") username: kotlin.String, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -123,7 +128,7 @@ interface UserApi { response = User::class ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = User::class), ApiResponse(code = 400, message = "Invalid username supplied"), ApiResponse(code = 404, message = "User not found")] + value = [ApiResponse(code = 200, message = "successful operation", response = User::class),ApiResponse(code = 400, message = "Invalid username supplied"),ApiResponse(code = 404, message = "User not found")] ) @RequestMapping( method = [RequestMethod.GET], @@ -133,7 +138,9 @@ interface UserApi { fun getUserByName( @ApiParam(value = "", required = true) @PathVariable("username") username: kotlin.String, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -143,7 +150,7 @@ interface UserApi { response = kotlin.String::class ) @ApiResponses( - value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class), ApiResponse(code = 400, message = "Invalid username/password supplied")] + value = [ApiResponse(code = 200, message = "successful operation", response = kotlin.String::class),ApiResponse(code = 400, message = "Invalid username/password supplied")] ) @RequestMapping( method = [RequestMethod.GET], @@ -154,7 +161,9 @@ interface UserApi { @NotNull @ApiParam(value = "", required = true) @Valid @RequestParam(value = "username", required = true) username: kotlin.String, @NotNull @ApiParam(value = "", required = true) @Valid @RequestParam(value = "password", required = true) password: kotlin.String, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -169,7 +178,9 @@ interface UserApi { method = [RequestMethod.GET], value = [PATH_LOGOUT_USER /* "/user/logout" */] ) - fun logoutUser(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity + fun logoutUser(@ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } @ApiOperation( @@ -178,7 +189,7 @@ interface UserApi { notes = "" ) @ApiResponses( - value = [ApiResponse(code = 400, message = "Invalid user supplied"), ApiResponse(code = 404, message = "User not found")] + value = [ApiResponse(code = 400, message = "Invalid user supplied"),ApiResponse(code = 404, message = "User not found")] ) @RequestMapping( method = [RequestMethod.PUT], @@ -189,10 +200,13 @@ interface UserApi { @ApiParam(value = "", required = true) @PathVariable("username") username: kotlin.String, @ApiParam(value = "", required = true) @Valid @RequestBody user: User, @ApiParam(hidden = true) request: javax.servlet.http.HttpServletRequest - ): ResponseEntity + ): ResponseEntity { + return ResponseEntity(HttpStatus.NOT_IMPLEMENTED) + } companion object { //for your own safety never directly reuse these path definitions in tests + const val BASE_PATH: String = "/v2" const val PATH_CREATE_USER: String = "/user" const val PATH_CREATE_USERS_WITH_ARRAY_INPUT: String = "/user/createWithArray" const val PATH_CREATE_USERS_WITH_LIST_INPUT: String = "/user/createWithList" diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt new file mode 100644 index 000000000000..f09c9e4036f2 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemWithDollarAttributesAndExamples.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param dollarName SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemWithDollarAttributesAndExamples( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$id") val dollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("\$name") val dollarName: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some" +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt new file mode 100644 index 000000000000..ce959d5caa44 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200Response.kt @@ -0,0 +1,42 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import org.openapitools.model.ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * + * @param itemDollarId SQ = "; SBS = \; DBS = \\; SD = $some + * @param nameDollarValue SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailsDollarInfo + */ +data class ItemsItemIdSomethingItemSubIdGet200Response( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("item\$Id") val itemDollarId: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("name\$Value") val nameDollarValue: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @field:Valid + @ApiModelProperty(example = "null", value = "") + @get:JsonProperty("details\$Info") val detailsDollarInfo: ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt new file mode 100644 index 000000000000..f1572d669057 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/main/kotlin/org/openapitools/model/ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo.kt @@ -0,0 +1,36 @@ +package org.openapitools.model + +import java.util.Locale +import java.util.Objects +import com.fasterxml.jackson.annotation.JsonProperty +import java.io.Serializable +import javax.validation.constraints.DecimalMax +import javax.validation.constraints.DecimalMin +import javax.validation.constraints.Email +import javax.validation.constraints.Max +import javax.validation.constraints.Min +import javax.validation.constraints.NotNull +import javax.validation.constraints.Pattern +import javax.validation.constraints.Size +import javax.validation.Valid +import io.swagger.annotations.ApiModelProperty + +/** + * SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarOne SQ = "; SBS = \; DBS = \\; SD = $some + * @param detailDollarTwo SQ = "; SBS = \; DBS = \\; SD = $some + */ +data class ItemsItemIdSomethingItemSubIdGet200ResponseDetailsInfo( + + @ApiModelProperty(example = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$One") val detailDollarOne: kotlin.String? = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some", + + @ApiModelProperty(example = "42", value = "SQ = \"; SBS = \\; DBS = \\\\; SD = \$some") + @get:JsonProperty("detail\$Two") val detailDollarTwo: kotlin.Int? = null +) : Serializable { + + companion object { + private const val serialVersionUID: kotlin.Long = 1 + } +} + diff --git a/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt new file mode 100644 index 000000000000..4e076731c962 --- /dev/null +++ b/samples/server/petstore/kotlin-springboot-x-kotlin-implements/src/test/kotlin/org/openapitools/api/ItemsApiTest.kt @@ -0,0 +1,46 @@ +package org.openapitools.api + +import org.openapitools.model.ItemWithDollarAttributesAndExamples +import org.openapitools.model.ItemsItemIdGet200Response +import org.junit.jupiter.api.Test +import org.springframework.http.ResponseEntity + +class ItemsApiTest { + + private val api: ItemsApiController = ItemsApiController() + + /** + * To test ItemsApiController.itemsItemIdGet + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun itemsItemIdGetTest() { + val itemDollarId: kotlin.String = TODO() + val filterDollarType: kotlin.String = TODO() + val xCustomDollarHeader: kotlin.String? = TODO() + val sessionDollarToken: kotlin.String? = TODO() + val request: javax.servlet.http.HttpServletRequest = TODO() + val response: ResponseEntity = api.itemsItemIdGet(itemDollarId, filterDollarType, xCustomDollarHeader, sessionDollarToken, request) + + // TODO: test validations + } + + /** + * To test ItemsApiController.itemsPost + * + * @throws ApiException + * if the Api call fails + */ + @Test + fun itemsPostTest() { + val xPostDollarHeader: kotlin.String? = TODO() + val formDollarName: kotlin.String? = TODO() + val formDollarValue: kotlin.String? = TODO() + val request: javax.servlet.http.HttpServletRequest = TODO() + val response: ResponseEntity = api.itemsPost(xPostDollarHeader, formDollarName, formDollarValue, request) + + // TODO: test validations + } +} diff --git a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt index 60e754529448..c65ddf31c90a 100644 --- a/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt +++ b/samples/server/petstore/kotlin-springboot/src/main/kotlin/org/openapitools/api/StoreApiService.kt @@ -6,7 +6,7 @@ interface StoreApiService { /** * DELETE /store/order/{orderId} : Delete purchase order by ID - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors * * @param orderId ID of the order that needs to be deleted (required) * @return Invalid ID supplied (status code 400) @@ -26,7 +26,7 @@ interface StoreApiService { /** * GET /store/order/{orderId} : Find purchase order by ID - * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions + * For valid response try integer IDs with value <= 5 or > 10. Other values will generate exceptions * * @param orderId ID of pet that needs to be fetched (required) * @return successful operation (status code 200)