Skip to content

Commit f766f44

Browse files
authored
[Kotlin Server] Update Ktor to the next major version 3 (#20245)
* [Kotlin Server] Update Ktor to version 3 * [Kotlin Server] Clean up * [Kotlin Server] Fix problems * [Kotlin Server] Fix Ktor and modelMutable samples * [Kotlin Server] Fix the string value for serialization key * [Kotlin Server] Remove setting Kotlin serialization flag to true * [Kotlin Server] Remove setting Kotlin serialization flag to true * [Kotlin Server] Remove the option to enable Kotlin serialization * [Kotlin Server] Use query parameters
1 parent 3e6f875 commit f766f44

File tree

50 files changed

+183
-271
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+183
-271
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinServerCodegen.java

+15
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,11 @@ public void processOpts() {
236236
LOGGER.info("`library` option is empty. Default to {}", DEFAULT_LIBRARY);
237237
}
238238

239+
if (isKtor()) {
240+
typeMapping.put("date-time", "kotlin.String");
241+
typeMapping.put("DateTime", "kotlin.String");
242+
}
243+
239244
if (additionalProperties.containsKey(Constants.AUTOMATIC_HEAD_REQUESTS)) {
240245
setAutoHeadFeatureEnabled(convertPropertyToBooleanAndWriteBack(Constants.AUTOMATIC_HEAD_REQUESTS));
241246
} else {
@@ -298,6 +303,8 @@ public void processOpts() {
298303
supportingFiles.add(new SupportingFile("gradle.properties", "", "gradle.properties"));
299304

300305
if (isKtor()) {
306+
additionalProperties.put(Constants.IS_KTOR, true);
307+
301308
supportingFiles.add(new SupportingFile("AppMain.kt.mustache", packageFolder, "AppMain.kt"));
302309
supportingFiles.add(new SupportingFile("Configuration.kt.mustache", packageFolder, "Configuration.kt"));
303310

@@ -365,6 +372,7 @@ public static class Constants {
365372
public static final String USE_MUTINY_DESC = "Whether to use Mutiny (should not be used with useCoroutines). This option is currently supported only when using jaxrs-spec library.";
366373
public static final String OMIT_GRADLE_WRAPPER = "omitGradleWrapper";
367374
public static final String OMIT_GRADLE_WRAPPER_DESC = "Whether to omit Gradle wrapper for creating a sub project.";
375+
public static final String IS_KTOR = "isKtor";
368376
}
369377

370378
@Override
@@ -386,6 +394,13 @@ public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<Mo
386394
if (operations != null && !Objects.equals(library, Constants.JAXRS_SPEC)) {
387395
List<CodegenOperation> ops = operations.getOperation();
388396
ops.forEach(operation -> {
397+
if (isKtor()) {
398+
ArrayList<CodegenParameter> params = new ArrayList<>();
399+
params.addAll(operation.pathParams);
400+
params.addAll(operation.queryParams);
401+
operation.vendorExtensions.put("ktor-params", params);
402+
}
403+
389404
List<CodegenResponse> responses = operation.responses;
390405
if (responses != null) {
391406
responses.forEach(resp -> {

modules/openapi-generator/src/main/resources/kotlin-server/data_class.mustache

+13-11
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
{{#parcelizeModels}}
1+
{{#isKtor}}
2+
import kotlinx.serialization.Serializable
3+
{{/isKtor}}
4+
{{^isKtor}}
5+
{{#parcelizeModels}}
26
import android.os.Parcelable
37
import kotlinx.parcelize.Parcelize
4-
5-
{{/parcelizeModels}}
6-
{{#serializableModel}}
8+
{{/parcelizeModels}}
9+
{{#serializableModel}}
710
import java.io.Serializable
8-
{{/serializableModel}}
11+
{{/serializableModel}}
12+
{{/isKtor}}
913
/**
1014
* {{{description}}}
1115
{{#vars}}
@@ -15,21 +19,19 @@ import java.io.Serializable
1519
{{#parcelizeModels}}
1620
@Parcelize
1721
{{/parcelizeModels}}
22+
{{#isKtor}}
23+
@Serializable
24+
{{/isKtor}}
1825
{{#hasVars}}data {{/hasVars}}class {{classname}}(
1926
{{#requiredVars}}
2027
{{>data_class_req_var}}{{^-last}},
2128
{{/-last}}{{/requiredVars}}{{#hasRequired}}{{#hasOptional}},
2229
{{/hasOptional}}{{/hasRequired}}{{#optionalVars}}{{>data_class_opt_var}}{{^-last}},
2330
{{/-last}}{{/optionalVars}}
24-
) {{^serializableModel}}{{#parcelizeModels}} : Parcelable{{/parcelizeModels}}{{/serializableModel}}{{^parcelizeModels}}{{#serializableModel}}: Serializable {{/serializableModel}}{{/parcelizeModels}}{{#parcelizeModels}}{{#serializableModel}} : Parcelable, Serializable {{/serializableModel}}{{/parcelizeModels}}
31+
){{^isKtor}}{{^serializableModel}}{{#parcelizeModels}} : Parcelable{{/parcelizeModels}}{{/serializableModel}}{{^parcelizeModels}}{{#serializableModel}}: Serializable {{/serializableModel}}{{/parcelizeModels}}{{#parcelizeModels}}{{#serializableModel}} : Parcelable, Serializable {{/serializableModel}}{{/parcelizeModels}}{{/isKtor}}
2532
{{#vendorExtensions.x-has-data-class-body}}
2633
{
2734
{{/vendorExtensions.x-has-data-class-body}}
28-
{{#serializableModel}}
29-
companion object {
30-
private const val serialVersionUID: Long = 123
31-
}
32-
{{/serializableModel}}
3335
{{#hasEnums}}
3436
{{#vars}}
3537
{{#isEnum}}

modules/openapi-generator/src/main/resources/kotlin-server/libraries/ktor/ApiKeyAuth.kt.mustache

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.openapitools.server.infrastructure
1+
package {{packageName}}.infrastructure
22

33
import io.ktor.http.auth.*
44
import io.ktor.server.application.*

modules/openapi-generator/src/main/resources/kotlin-server/libraries/ktor/AppMain.kt.mustache

+4-13
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package {{packageName}}
22

33
import io.ktor.server.application.*
4-
import io.ktor.serialization.gson.*
54
import io.ktor.http.*
65
{{#featureResources}}
76
import io.ktor.server.resources.*
@@ -30,24 +29,17 @@ import java.util.concurrent.TimeUnit
3029
{{/featureMetrics}}
3130
import io.ktor.server.routing.*
3231
{{#hasAuthMethods}}
32+
import io.ktor.serialization.kotlinx.json.json
3333
import com.typesafe.config.ConfigFactory
3434
import io.ktor.client.HttpClient
3535
import io.ktor.client.engine.apache.Apache
3636
import io.ktor.server.config.HoconApplicationConfig
3737
import io.ktor.server.auth.*
38-
import org.openapitools.server.infrastructure.*
38+
import {{packageName}}.infrastructure.*
3939
{{/hasAuthMethods}}
4040
{{#generateApis}}{{#apiInfo}}{{#apis}}import {{apiPackage}}.{{classname}}
4141
{{/apis}}{{/apiInfo}}{{/generateApis}}
4242

43-
{{#hasAuthMethods}}
44-
internal val settings = HoconApplicationConfig(ConfigFactory.defaultApplication(HTTP::class.java.classLoader))
45-
46-
object HTTP {
47-
val client = HttpClient(Apache)
48-
}
49-
{{/hasAuthMethods}}
50-
5143
fun Application.main() {
5244
install(DefaultHeaders)
5345
{{#featureMetrics}}
@@ -62,7 +54,7 @@ fun Application.main() {
6254
{{/featureMetrics}}
6355
{{#generateApis}}
6456
install(ContentNegotiation) {
65-
register(ContentType.Application.Json, GsonConverter())
57+
json()
6658
}
6759
{{#featureAutoHead}}
6860
install(AutoHeadResponse) // see https://ktor.io/docs/autoheadresponse.html
@@ -125,7 +117,7 @@ fun Application.main() {
125117
{{/authMethods}}
126118
}
127119
{{/hasAuthMethods}}
128-
install(Routing) {
120+
routing {
129121
{{#apiInfo}}
130122
{{#apis}}
131123
{{#operations}}
@@ -134,6 +126,5 @@ fun Application.main() {
134126
{{/apis}}
135127
{{/apiInfo}}
136128
}
137-
138129
{{/generateApis}}
139130
}

modules/openapi-generator/src/main/resources/kotlin-server/libraries/ktor/Paths.kt.mustache

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ object Paths {
1818
{{#allParams}}* @param {{paramName}} {{description}} {{^required}}(optional{{#defaultValue}}, default to {{{.}}}{{/defaultValue}}){{/required}}
1919
{{/allParams}}*/
2020
{{#hasParams}}
21-
@Serializable @Resource("{{{path}}}") class {{operationId}}({{#allParams}}val {{paramName}}: {{{dataType}}}{{^required}}? = null{{/required}}{{#required}}{{#isNullable}}?{{/isNullable}}{{/required}}{{^-last}}, {{/-last}}{{/allParams}})
21+
@Resource("{{{path}}}") class {{operationId}}({{#vendorExtensions.ktor-params}}val {{paramName}}: {{{dataType}}}{{^required}}? = null{{/required}}{{#required}}{{#isNullable}}?{{/isNullable}}{{/required}}{{^-last}}, {{/-last}}{{/vendorExtensions.ktor-params}})
2222
{{/hasParams}}
2323
{{^hasParams}}
24-
@Serializable @Resource("{{{path}}}") class {{operationId}}
24+
@Resource("{{{path}}}") class {{operationId}}
2525
{{/hasParams}}
2626

2727
{{/operation}}

modules/openapi-generator/src/main/resources/kotlin-server/libraries/ktor/_principal.mustache

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{{#authMethods}}
22
{{#isBasicBasic}}
3-
val principal = call.authentication.principal<UserIdPrincipal>()!!
3+
val principal = call.authentication.principal<UserIdPrincipal>()
44
{{/isBasicBasic}}{{^isBasicBasic}}{{#isApiKey}}
5-
val principal = call.authentication.principal<ApiPrincipal>()!!
5+
val principal = call.authentication.principal<ApiPrincipal>()
66
{{/isApiKey}}{{^isApiKey}}{{#isOAuth}}
7-
val principal = call.authentication.principal<OAuthAccessTokenResponse>()!!
7+
val principal = call.authentication.principal<OAuthAccessTokenResponse>()
88
{{/isOAuth}}{{^isOAuth}}
99
val principal = null!!
1010
{{/isOAuth}}{{/isApiKey}}{{/isBasicBasic}}

modules/openapi-generator/src/main/resources/kotlin-server/libraries/ktor/_response.mustache

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ val exampleContentType = "{{{contentType}}}"
22
val exampleContentString = """{{&example}}"""
33

44
when (exampleContentType) {
5-
"application/json" -> call.respond(gson.fromJson(exampleContentString, empty::class.java))
5+
"application/json" -> call.respondText(exampleContentType, ContentType.Application.Json)
66
"application/xml" -> call.respondText(exampleContentString, ContentType.Text.Xml)
77
else -> call.respondText(exampleContentString)
88
}

modules/openapi-generator/src/main/resources/kotlin-server/libraries/ktor/api.mustache

-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
{{>licenseInfo}}
22
package {{apiPackage}}
33

4-
import com.google.gson.Gson
54
import io.ktor.http.*
65
import io.ktor.server.application.*
76
import io.ktor.server.auth.*
@@ -23,7 +22,6 @@ import {{packageName}}.infrastructure.ApiPrincipal
2322

2423
{{#operations}}
2524
fun Route.{{classname}}() {
26-
val gson = Gson()
2725
val empty = mutableMapOf<String, Any?>()
2826
2927
{{#operation}}

modules/openapi-generator/src/main/resources/kotlin-server/libraries/ktor/build.gradle.kts.mustache

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ version = "{{artifactVersion}}"
77

88
plugins {
99
kotlin("jvm") version "2.0.20"
10-
id("io.ktor.plugin") version "2.3.12"
10+
application
11+
kotlin("plugin.serialization") version "2.0.20"
1112
}
1213

1314
application {
@@ -22,6 +23,7 @@ repositories {
2223
}
2324

2425
dependencies {
26+
implementation(platform("io.ktor:ktor-bom:3.0.2"))
2527
implementation("ch.qos.logback:logback-classic:$logback_version")
2628
{{#hasAuthMethods}}
2729
implementation("com.typesafe:config:1.4.1")
@@ -35,7 +37,7 @@ dependencies {
3537
{{/featureAutoHead}}
3638
implementation("io.ktor:ktor-server-default-headers")
3739
implementation("io.ktor:ktor-server-content-negotiation")
38-
implementation("io.ktor:ktor-serialization-gson")
40+
implementation("io.ktor:ktor-serialization-kotlinx-json")
3941
{{#featureResources}}
4042
implementation("io.ktor:ktor-server-resources")
4143
{{/featureResources}}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
kotlin.code.style=official
2-
ktor_version=2.3.12
2+
ktor_version=3.0.2
33
kotlin_version=2.0.20
44
logback_version=1.4.14

samples/server/petstore/kotlin-server-modelMutable/build.gradle

-74
This file was deleted.

samples/server/petstore/kotlin-server-modelMutable/build.gradle.kts

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ version = "1.0.0"
77

88
plugins {
99
kotlin("jvm") version "2.0.20"
10-
id("io.ktor.plugin") version "2.3.12"
10+
application
11+
kotlin("plugin.serialization") version "2.0.20"
1112
}
1213

1314
application {
@@ -22,14 +23,15 @@ repositories {
2223
}
2324

2425
dependencies {
26+
implementation(platform("io.ktor:ktor-bom:3.0.2"))
2527
implementation("ch.qos.logback:logback-classic:$logback_version")
2628
implementation("com.typesafe:config:1.4.1")
2729
implementation("io.ktor:ktor-server-auth")
2830
implementation("io.ktor:ktor-client-apache")
2931
implementation("io.ktor:ktor-server-auto-head-response")
3032
implementation("io.ktor:ktor-server-default-headers")
3133
implementation("io.ktor:ktor-server-content-negotiation")
32-
implementation("io.ktor:ktor-serialization-gson")
34+
implementation("io.ktor:ktor-serialization-kotlinx-json")
3335
implementation("io.ktor:ktor-server-resources")
3436
implementation("io.ktor:ktor-server-hsts")
3537
implementation("io.ktor:ktor-server-compression")
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
kotlin.code.style=official
2-
ktor_version=2.3.12
2+
ktor_version=3.0.2
33
kotlin_version=2.0.20
44
logback_version=1.4.14

0 commit comments

Comments
 (0)