From d466b0debdd4cb2a6e9f36c97a486a1de835e381 Mon Sep 17 00:00:00 2001 From: Francesco Guardiani Date: Mon, 18 Mar 2024 18:33:32 +0100 Subject: [PATCH] Fix #239, use simple class name as default name (#241) --- .../dev/restate/sdk/gen/ElementConverter.java | 7 ++---- .../restate/sdk/GreeterWithExplicitName.java | 18 +++++++++++++ .../sdk/GreeterWithoutExplicitName.java | 18 +++++++++++++ .../dev/restate/sdk/NameInferenceTest.java | 25 +++++++++++++++++++ .../sdk/http/vertx/RestateHttpEndpointTest.kt | 6 ++--- 5 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 sdk-api-gen/src/test/java/dev/restate/sdk/GreeterWithExplicitName.java create mode 100644 sdk-api-gen/src/test/java/dev/restate/sdk/GreeterWithoutExplicitName.java create mode 100644 sdk-api-gen/src/test/java/dev/restate/sdk/NameInferenceTest.java diff --git a/sdk-api-gen/src/main/java/dev/restate/sdk/gen/ElementConverter.java b/sdk-api-gen/src/main/java/dev/restate/sdk/gen/ElementConverter.java index 2dbfab9d..e9c7a7ad 100644 --- a/sdk-api-gen/src/main/java/dev/restate/sdk/gen/ElementConverter.java +++ b/sdk-api-gen/src/main/java/dev/restate/sdk/gen/ElementConverter.java @@ -90,12 +90,9 @@ public Component fromTypeElement(TypeElement element) { ? virtualObjectAnnotation.name() : workflowAnnotation.name(); if (componentName.isEmpty()) { - // Use FQCN - // With this logic we make sure we flatten subclasses names - String simpleComponentName = - targetFqcn.toString().substring(targetPkg.length()).replaceAll(Pattern.quote("."), ""); + // Use simple class name, flattening subclasses names componentName = - targetPkg.length() > 0 ? targetPkg + "." + simpleComponentName : simpleComponentName; + targetFqcn.toString().substring(targetPkg.length()).replaceAll(Pattern.quote("."), ""); } // Compute handlers diff --git a/sdk-api-gen/src/test/java/dev/restate/sdk/GreeterWithExplicitName.java b/sdk-api-gen/src/test/java/dev/restate/sdk/GreeterWithExplicitName.java new file mode 100644 index 00000000..b3fda9b2 --- /dev/null +++ b/sdk-api-gen/src/test/java/dev/restate/sdk/GreeterWithExplicitName.java @@ -0,0 +1,18 @@ +// Copyright (c) 2023 - Restate Software, Inc., Restate GmbH +// +// This file is part of the Restate Java SDK, +// which is released under the MIT license. +// +// You can find a copy of the license in file LICENSE in the root +// directory of this repository or package, or at +// https://github.com/restatedev/sdk-java/blob/main/LICENSE +package dev.restate.sdk; + +import dev.restate.sdk.annotation.Handler; +import dev.restate.sdk.annotation.Service; + +@Service(name = "MyExplicitName") +public interface GreeterWithExplicitName { + @Handler + String greet(Context context, String request); +} diff --git a/sdk-api-gen/src/test/java/dev/restate/sdk/GreeterWithoutExplicitName.java b/sdk-api-gen/src/test/java/dev/restate/sdk/GreeterWithoutExplicitName.java new file mode 100644 index 00000000..56d6b9c0 --- /dev/null +++ b/sdk-api-gen/src/test/java/dev/restate/sdk/GreeterWithoutExplicitName.java @@ -0,0 +1,18 @@ +// Copyright (c) 2023 - Restate Software, Inc., Restate GmbH +// +// This file is part of the Restate Java SDK, +// which is released under the MIT license. +// +// You can find a copy of the license in file LICENSE in the root +// directory of this repository or package, or at +// https://github.com/restatedev/sdk-java/blob/main/LICENSE +package dev.restate.sdk; + +import dev.restate.sdk.annotation.Handler; +import dev.restate.sdk.annotation.Service; + +@Service +public interface GreeterWithoutExplicitName { + @Handler + String greet(Context context, String request); +} diff --git a/sdk-api-gen/src/test/java/dev/restate/sdk/NameInferenceTest.java b/sdk-api-gen/src/test/java/dev/restate/sdk/NameInferenceTest.java new file mode 100644 index 00000000..ab20cff0 --- /dev/null +++ b/sdk-api-gen/src/test/java/dev/restate/sdk/NameInferenceTest.java @@ -0,0 +1,25 @@ +// Copyright (c) 2023 - Restate Software, Inc., Restate GmbH +// +// This file is part of the Restate Java SDK, +// which is released under the MIT license. +// +// You can find a copy of the license in file LICENSE in the root +// directory of this repository or package, or at +// https://github.com/restatedev/sdk-java/blob/main/LICENSE +package dev.restate.sdk; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; + +public class NameInferenceTest { + + @Test + void expectedName() { + assertThat(CodegenTestServiceGreeterClient.COMPONENT_NAME) + .isEqualTo("CodegenTestServiceGreeter"); + assertThat(GreeterWithoutExplicitNameClient.COMPONENT_NAME) + .isEqualTo("GreeterWithoutExplicitName"); + assertThat(MyExplicitNameClient.COMPONENT_NAME).isEqualTo("MyExplicitName"); + } +} diff --git a/sdk-http-vertx/src/test/kotlin/dev/restate/sdk/http/vertx/RestateHttpEndpointTest.kt b/sdk-http-vertx/src/test/kotlin/dev/restate/sdk/http/vertx/RestateHttpEndpointTest.kt index 421075bd..054b2224 100644 --- a/sdk-http-vertx/src/test/kotlin/dev/restate/sdk/http/vertx/RestateHttpEndpointTest.kt +++ b/sdk-http-vertx/src/test/kotlin/dev/restate/sdk/http/vertx/RestateHttpEndpointTest.kt @@ -56,7 +56,7 @@ internal class RestateHttpEndpointTest { @Timeout(value = 1, timeUnit = TimeUnit.SECONDS) @Test fun endpointWithBlockingService(vertx: Vertx): Unit = - greetTest(vertx, BlockingGreeter::class.qualifiedName!!) { it.with(BlockingGreeter()) } + greetTest(vertx, BlockingGreeter::class.simpleName!!) { it.with(BlockingGreeter()) } private fun greetTest( vertx: Vertx, @@ -169,7 +169,7 @@ internal class RestateHttpEndpointTest { HttpMethod.POST, endpointPort, "localhost", - "/invoke/" + BlockingGreeter::class.java.canonicalName + "/unknownMethod") + "/invoke/" + BlockingGreeter::class.java.simpleName + "/unknownMethod") .coAwait() // Prepare request header @@ -218,7 +218,7 @@ internal class RestateHttpEndpointTest { assertThat(discoveryResponse.components) .map { it.fullyQualifiedComponentName } - .containsOnly(BlockingGreeter::class.java.canonicalName) + .containsOnly(BlockingGreeter::class.java.simpleName) } fun encode(msg: MessageLite): Buffer {