From 84a20ee198c19f517cec8d4816e4e06e080843ba Mon Sep 17 00:00:00 2001 From: slinkydeveloper Date: Mon, 18 Aug 2025 08:39:19 +0200 Subject: [PATCH 1/4] Bump Vert.x --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1574199d..fcf4d8b1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -230,5 +230,5 @@ restate = '2.3.0-SNAPSHOT' schema-kenerator = '2.1.2' spring-boot = '3.4.5' - vertx = '4.5.16' + vertx = '4.5.18' victools-json-schema = '4.38.0' From c9ef43d87a7288a29d2ce967c8a814e85da160f8 Mon Sep 17 00:00:00 2001 From: slinkydeveloper Date: Mon, 18 Aug 2025 09:13:46 +0200 Subject: [PATCH 2/4] Several bumps -> Kotlin 2.2 and deps, new spotless, other gradle plugins --- buildSrc/build.gradle.kts | 6 +++--- gradle/libs.versions.toml | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index bd2c3b58..002f2bc2 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -9,7 +9,7 @@ repositories { dependencies { - implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.21") - implementation("org.jetbrains.kotlin:kotlin-serialization:2.0.21") - implementation("com.diffplug.spotless:spotless-plugin-gradle:6.25.0") + implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:2.2.10") + implementation("org.jetbrains.kotlin:kotlin-serialization:2.2.10") + implementation("com.diffplug.spotless:spotless-plugin-gradle:7.2.1") } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fcf4d8b1..e9c928ce 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -200,8 +200,8 @@ ref = 'victools-json-schema' [plugins] - aggregate-javadoc = 'io.freefair.aggregate-javadoc:8.6' - dependency-license-report = 'com.github.jk1.dependency-license-report:2.0' + aggregate-javadoc = 'io.freefair.aggregate-javadoc:8.14' + dependency-license-report = 'com.github.jk1.dependency-license-report:2.9' dokka = 'org.jetbrains.dokka:1.9.20' jib = 'com.google.cloud.tools.jib:3.4.4' jsonschema2pojo = 'org.jsonschema2pojo:1.2.1' @@ -209,7 +209,7 @@ openapi-generator = 'org.openapi.generator:7.5.0' protobuf = 'com.google.protobuf:0.9.4' shadow = 'com.gradleup.shadow:9.0.0-beta8' - spotless = 'com.diffplug.spotless:6.25.0' + spotless = 'com.diffplug.spotless:7.2.1' spring-dependency-management = 'io.spring.dependency-management:1.1.6' [plugins.ksp] @@ -221,9 +221,9 @@ [versions] jackson = '2.18.1' junit = '5.10.2' - kotlinx-coroutines = '1.9.0' - kotlinx-serialization = '1.7.3' - ksp = '2.0.21-1.0.28' + kotlinx-coroutines = '1.10.2' + kotlinx-serialization = '1.9.0' + ksp = '2.2.10-2.0.2' log4j = '2.24.2' opentelemetry = '1.47.0' protobuf = '4.29.3' From 12df62634de67e6b5e3bef1f8f99103014dbd901 Mon Sep 17 00:00:00 2001 From: slinkydeveloper Date: Mon, 18 Aug 2025 09:14:18 +0200 Subject: [PATCH 3/4] Relaxed Serde interface nullability constraints. These should not affect bytecode compatibility, but only linters using the jspecify annotations. --- .../src/main/java/dev/restate/serde/Serde.java | 16 ++++++++-------- .../kotlin/dev/restate/sdk/kotlin/futures.kt | 3 ++- .../main/java/dev/restate/sdk/JsonSerdes.java | 3 ++- .../java/dev/restate/sdk/core/TestSerdes.java | 3 ++- .../core/vertx/ThreadTrampoliningTestSuite.kt | 2 +- .../kotlinx/KotlinSerializationSerdeFactory.kt | 2 -- .../kotlin/RestateHttpEndpointBeanTest.kt | 2 +- .../sdk/testservices/TestUtilsServiceImpl.kt | 2 +- 8 files changed, 17 insertions(+), 16 deletions(-) diff --git a/common/src/main/java/dev/restate/serde/Serde.java b/common/src/main/java/dev/restate/serde/Serde.java index 5da8d401..e23f06ce 100644 --- a/common/src/main/java/dev/restate/serde/Serde.java +++ b/common/src/main/java/dev/restate/serde/Serde.java @@ -11,6 +11,7 @@ import dev.restate.common.Slice; import dev.restate.common.function.ThrowingFunction; import java.util.Objects; +import org.jetbrains.annotations.NotNull; import org.jspecify.annotations.*; /** @@ -24,12 +25,11 @@ * * @see SerdeFactory */ -@NullMarked public interface Serde extends TypeTag { Slice serialize(T value); - T deserialize(Slice value); + T deserialize(@NonNull Slice value); // --- Metadata about the serialized/deserialized content @@ -72,7 +72,7 @@ public Slice serialize(T value) { } @Override - public T deserialize(Slice value) { + public T deserialize(@NotNull Slice value) { return deserializer.asFunction().apply(value.toByteArray()); } }; @@ -93,7 +93,7 @@ public Slice serialize(T value) { } @Override - public T deserialize(Slice value) { + public T deserialize(@NotNull Slice value) { return deserializer.asFunction().apply(value.toByteArray()); } @@ -112,7 +112,7 @@ public Slice serialize(T value) { } @Override - public T deserialize(Slice value) { + public T deserialize(@NotNull Slice value) { return inner.deserialize(value); } @@ -132,7 +132,7 @@ public Slice serialize(Void value) { } @Override - public Void deserialize(Slice value) { + public Void deserialize(@NotNull Slice value) { return null; } @@ -151,7 +151,7 @@ public Slice serialize(byte[] value) { } @Override - public byte[] deserialize(Slice value) { + public byte[] deserialize(@NotNull Slice value) { return value.toByteArray(); } }; @@ -165,7 +165,7 @@ public Slice serialize(Slice value) { } @Override - public Slice deserialize(Slice value) { + public Slice deserialize(@NotNull Slice value) { return value; } }; diff --git a/sdk-api-kotlin/src/main/kotlin/dev/restate/sdk/kotlin/futures.kt b/sdk-api-kotlin/src/main/kotlin/dev/restate/sdk/kotlin/futures.kt index 827f754a..12b9fbb5 100644 --- a/sdk-api-kotlin/src/main/kotlin/dev/restate/sdk/kotlin/futures.kt +++ b/sdk-api-kotlin/src/main/kotlin/dev/restate/sdk/kotlin/futures.kt @@ -51,7 +51,8 @@ internal abstract class BaseDurableFutureImpl : DurableFuture { } try { - @Suppress("UNCHECKED_CAST") return@simpleMap this.asyncResult().poll().getNow(null) as T + @Suppress("UNCHECKED_CAST") + return@simpleMap this.asyncResult().poll().getNow(null) as T } catch (e: ExecutionException) { throw e.cause ?: e // unwrap original cause from ExecutionException } diff --git a/sdk-api/src/main/java/dev/restate/sdk/JsonSerdes.java b/sdk-api/src/main/java/dev/restate/sdk/JsonSerdes.java index 165445e3..96754bbe 100644 --- a/sdk-api/src/main/java/dev/restate/sdk/JsonSerdes.java +++ b/sdk-api/src/main/java/dev/restate/sdk/JsonSerdes.java @@ -20,6 +20,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Map; +import org.jetbrains.annotations.NotNull; import org.jspecify.annotations.NonNull; /** @@ -191,7 +192,7 @@ public Slice serialize(T value) { } @Override - public T deserialize(Slice value) { + public T deserialize(@NotNull Slice value) { ByteArrayInputStream inputStream = new ByteArrayInputStream(value.toByteArray()); try (JsonParser parser = JSON_FACTORY.createParser(inputStream)) { return deserializer.asFunction().apply(parser); diff --git a/sdk-core/src/test/java/dev/restate/sdk/core/TestSerdes.java b/sdk-core/src/test/java/dev/restate/sdk/core/TestSerdes.java index 55e187fb..ded3f337 100644 --- a/sdk-core/src/test/java/dev/restate/sdk/core/TestSerdes.java +++ b/sdk-core/src/test/java/dev/restate/sdk/core/TestSerdes.java @@ -19,6 +19,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import org.jetbrains.annotations.NotNull; import org.jspecify.annotations.Nullable; /** @@ -124,7 +125,7 @@ public Slice serialize(@Nullable T value) { } @Override - public T deserialize(Slice value) { + public T deserialize(@NotNull Slice value) { ByteArrayInputStream inputStream = new ByteArrayInputStream(value.toByteArray()); try (JsonParser parser = JSON_FACTORY.createParser(inputStream)) { return deserializer.asFunction().apply(parser); diff --git a/sdk-core/src/test/kotlin/dev/restate/sdk/core/vertx/ThreadTrampoliningTestSuite.kt b/sdk-core/src/test/kotlin/dev/restate/sdk/core/vertx/ThreadTrampoliningTestSuite.kt index d50788c5..46a2a4bf 100644 --- a/sdk-core/src/test/kotlin/dev/restate/sdk/core/vertx/ThreadTrampoliningTestSuite.kt +++ b/sdk-core/src/test/kotlin/dev/restate/sdk/core/vertx/ThreadTrampoliningTestSuite.kt @@ -51,7 +51,7 @@ class ThreadTrampoliningTestSuite : TestDefinitions.TestSuite { private fun checkBlockingComponentTrampolineExecutor( ctx: dev.restate.sdk.Context, - _unused: Any + _unused: Any? ): Void? { val id = Thread.currentThread().id check(Vertx.currentContext() == null) diff --git a/sdk-serde-kotlinx/src/main/kotlin/dev/restate/serde/kotlinx/KotlinSerializationSerdeFactory.kt b/sdk-serde-kotlinx/src/main/kotlin/dev/restate/serde/kotlinx/KotlinSerializationSerdeFactory.kt index db1ce7ec..59b59900 100644 --- a/sdk-serde-kotlinx/src/main/kotlin/dev/restate/serde/kotlinx/KotlinSerializationSerdeFactory.kt +++ b/sdk-serde-kotlinx/src/main/kotlin/dev/restate/serde/kotlinx/KotlinSerializationSerdeFactory.kt @@ -96,7 +96,6 @@ constructor( val UNIT: Serde = object : Serde { // This is fine, it's less strict - @Suppress("WRONG_NULLABILITY_FOR_JAVA_OVERRIDE") override fun serialize(value: Unit?): Slice { return Slice.EMPTY } @@ -119,7 +118,6 @@ constructor( val schema = jsonSchemaFactory.generateSchema(json, serializer) return object : Serde { - @Suppress("WRONG_NULLABILITY_FOR_JAVA_OVERRIDE") override fun serialize(value: T?): Slice { if (value == null) { return Slice.wrap(json.encodeToString(JsonNull.serializer(), JsonNull)) diff --git a/sdk-spring-boot-kotlin-starter/src/test/kotlin/dev/restate/sdk/springboot/kotlin/RestateHttpEndpointBeanTest.kt b/sdk-spring-boot-kotlin-starter/src/test/kotlin/dev/restate/sdk/springboot/kotlin/RestateHttpEndpointBeanTest.kt index 5bb7c638..e1fc078c 100644 --- a/sdk-spring-boot-kotlin-starter/src/test/kotlin/dev/restate/sdk/springboot/kotlin/RestateHttpEndpointBeanTest.kt +++ b/sdk-spring-boot-kotlin-starter/src/test/kotlin/dev/restate/sdk/springboot/kotlin/RestateHttpEndpointBeanTest.kt @@ -55,7 +55,7 @@ class RestateHttpEndpointBeanTest { .readValue(response.body(), EndpointManifestSchema::class.java) Assertions.assertThat(endpointManifest.services) - .map({ it.name }) + .map { it?.name } .containsOnly("greeter") } } diff --git a/test-services/src/main/kotlin/dev/restate/sdk/testservices/TestUtilsServiceImpl.kt b/test-services/src/main/kotlin/dev/restate/sdk/testservices/TestUtilsServiceImpl.kt index 07dbd9f2..d040e1de 100644 --- a/test-services/src/main/kotlin/dev/restate/sdk/testservices/TestUtilsServiceImpl.kt +++ b/test-services/src/main/kotlin/dev/restate/sdk/testservices/TestUtilsServiceImpl.kt @@ -41,7 +41,7 @@ class TestUtilsServiceImpl : TestUtilsService { override suspend fun countExecutedSideEffects(context: Context, increments: Int): Int { val invokedSideEffects = AtomicInteger(0) - for (i in 0 ..< increments) { + for (i in 0.. Date: Mon, 18 Aug 2025 09:26:45 +0200 Subject: [PATCH 4/4] Remove jetbrains @NotNull usage --- .../java/dev/restate/client/base/BaseClient.java | 5 ++--- common/src/main/java/dev/restate/serde/Serde.java | 13 ++++++------- .../src/main/java/dev/restate/sdk/JsonSerdes.java | 3 +-- .../test/java/dev/restate/sdk/core/TestSerdes.java | 4 ++-- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/client/src/main/java/dev/restate/client/base/BaseClient.java b/client/src/main/java/dev/restate/client/base/BaseClient.java index 773e7a08..d9742a45 100644 --- a/client/src/main/java/dev/restate/client/base/BaseClient.java +++ b/client/src/main/java/dev/restate/client/base/BaseClient.java @@ -30,7 +30,6 @@ import java.util.stream.Stream; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.jetbrains.annotations.NotNull; import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; @@ -358,7 +357,7 @@ protected abstract CompletableFuture doPostRequest( protected abstract CompletableFuture doGetRequest( URI target, Stream> headers, ResponseMapper responseMapper); - private @NotNull ResponseMapper> callResponseMapper( + private @NonNull ResponseMapper> callResponseMapper( String requestMethod, URI requestUri, Serde resSerde) { return (statusCode, responseHeaders, responseBody) -> { if (statusCode >= 300) { @@ -389,7 +388,7 @@ protected abstract CompletableFuture doGetRequest( }; } - private @NotNull ResponseMapper>> getOutputResponseMapper( + private @NonNull ResponseMapper>> getOutputResponseMapper( String requestMethod, URI requestUri, Serde resSerde) { return (statusCode, responseHeaders, responseBody) -> { if (statusCode == 470) { diff --git a/common/src/main/java/dev/restate/serde/Serde.java b/common/src/main/java/dev/restate/serde/Serde.java index e23f06ce..7f4e6af9 100644 --- a/common/src/main/java/dev/restate/serde/Serde.java +++ b/common/src/main/java/dev/restate/serde/Serde.java @@ -11,7 +11,6 @@ import dev.restate.common.Slice; import dev.restate.common.function.ThrowingFunction; import java.util.Objects; -import org.jetbrains.annotations.NotNull; import org.jspecify.annotations.*; /** @@ -72,7 +71,7 @@ public Slice serialize(T value) { } @Override - public T deserialize(@NotNull Slice value) { + public T deserialize(@NonNull Slice value) { return deserializer.asFunction().apply(value.toByteArray()); } }; @@ -93,7 +92,7 @@ public Slice serialize(T value) { } @Override - public T deserialize(@NotNull Slice value) { + public T deserialize(@NonNull Slice value) { return deserializer.asFunction().apply(value.toByteArray()); } @@ -112,7 +111,7 @@ public Slice serialize(T value) { } @Override - public T deserialize(@NotNull Slice value) { + public T deserialize(@NonNull Slice value) { return inner.deserialize(value); } @@ -132,7 +131,7 @@ public Slice serialize(Void value) { } @Override - public Void deserialize(@NotNull Slice value) { + public Void deserialize(@NonNull Slice value) { return null; } @@ -151,7 +150,7 @@ public Slice serialize(byte[] value) { } @Override - public byte[] deserialize(@NotNull Slice value) { + public byte[] deserialize(@NonNull Slice value) { return value.toByteArray(); } }; @@ -165,7 +164,7 @@ public Slice serialize(Slice value) { } @Override - public Slice deserialize(@NotNull Slice value) { + public Slice deserialize(@NonNull Slice value) { return value; } }; diff --git a/sdk-api/src/main/java/dev/restate/sdk/JsonSerdes.java b/sdk-api/src/main/java/dev/restate/sdk/JsonSerdes.java index 96754bbe..0d948646 100644 --- a/sdk-api/src/main/java/dev/restate/sdk/JsonSerdes.java +++ b/sdk-api/src/main/java/dev/restate/sdk/JsonSerdes.java @@ -20,7 +20,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Map; -import org.jetbrains.annotations.NotNull; import org.jspecify.annotations.NonNull; /** @@ -192,7 +191,7 @@ public Slice serialize(T value) { } @Override - public T deserialize(@NotNull Slice value) { + public T deserialize(@NonNull Slice value) { ByteArrayInputStream inputStream = new ByteArrayInputStream(value.toByteArray()); try (JsonParser parser = JSON_FACTORY.createParser(inputStream)) { return deserializer.asFunction().apply(parser); diff --git a/sdk-core/src/test/java/dev/restate/sdk/core/TestSerdes.java b/sdk-core/src/test/java/dev/restate/sdk/core/TestSerdes.java index ded3f337..a6011a98 100644 --- a/sdk-core/src/test/java/dev/restate/sdk/core/TestSerdes.java +++ b/sdk-core/src/test/java/dev/restate/sdk/core/TestSerdes.java @@ -19,7 +19,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; /** @@ -125,7 +125,7 @@ public Slice serialize(@Nullable T value) { } @Override - public T deserialize(@NotNull Slice value) { + public T deserialize(@NonNull Slice value) { ByteArrayInputStream inputStream = new ByteArrayInputStream(value.toByteArray()); try (JsonParser parser = JSON_FACTORY.createParser(inputStream)) { return deserializer.asFunction().apply(parser);