diff --git a/docs/src/modules/java/nav.adoc b/docs/src/modules/java/nav.adoc index 28c7189c31..d002859e1c 100644 --- a/docs/src/modules/java/nav.adoc +++ b/docs/src/modules/java/nav.adoc @@ -5,7 +5,7 @@ *** xref:java:spring-boot-integration.adoc[Spring Boot Integration] *** xref:java:value-entity.adoc[Implementing Value Entities] *** xref:java:event-sourced-entities.adoc[Implementing Event Sourced Entities] -*** xref:java:workflow-entities.adoc[Implementing Workflow Entities] +*** xref:java:workflows.adoc[Implementing Workflows] // *** xref:java:replicated-entity.adoc[Implementing Replicated Entities] to be implemented *** xref:java:views.adoc[Implementing Views] *** xref:java:actions.adoc[Implementing Actions] diff --git a/docs/src/modules/java/pages/event-sourced-entities.adoc b/docs/src/modules/java/pages/event-sourced-entities.adoc index 54aa0910cb..f2d6b9af74 100644 --- a/docs/src/modules/java/pages/event-sourced-entities.adoc +++ b/docs/src/modules/java/pages/event-sourced-entities.adoc @@ -61,12 +61,12 @@ Let's have a look at what our shopping cart entity will look like for the first include::example$java-spring-eventsourced-shopping-cart/src/main/java/com/example/shoppingcart/ShoppingCartEntity.java[tag=class] ---- <1> Create a class that extends `EventSourcedEntity`, where `S` is the state type this entity will store (i.e. `ShoppingCart`) and `E` is the top type for the events it emits (i.e. `ShoppingCartEvent`). -<2> Annotate such class with `@EntityKey` and pass the name of the key that will be used as the entity unique identifier. -<3> Make sure to annotate such class with `@EntityType` and pass a unique name for this entity type. +<2> Annotate such class with `@Id` and pass the name of the id that will be used as the entity instance unique identifier. +<3> Make sure to annotate such class with `@TypeId` and pass a unique identifier for this entity type. <4> Use Spring's RequestMapping annotation to define the route to your entity. -NOTE: The EntityKey `cartId` must match a path parameter (i.e. `cartId`) and such value needs to be unique per entity. On the other hand, the EntityType `shopping-cart` is common for all instances of this entity but must be stable - cannot be changed after a production deploy - and unique across the different entity types. +NOTE: The `@Id` value `cartId` must match a path parameter (i.e. `cartId`) and such value needs to be unique per entity. On the other hand, the `@TypeId` value `shopping-cart` is common for all instances of this entity but must be stable - cannot be changed after a production deploy - and unique across the different entity types. === Updating state diff --git a/docs/src/modules/java/pages/getting-started.adoc b/docs/src/modules/java/pages/getting-started.adoc index d794e42469..1e08d41a57 100644 --- a/docs/src/modules/java/pages/getting-started.adoc +++ b/docs/src/modules/java/pages/getting-started.adoc @@ -62,12 +62,12 @@ that receives commands to increase the counter. ---- include::example$java-spring-valueentity-counter/src/main/java/com/example/CounterEntity.java[tags=declarations;increase;close] ---- -<1> Every Entity must be annotated with `@EntityType` with a stable name. This name should be unique among the different existing entities within a Kalix application. -<2> The `@EntityKey` value should be unique per entity and map to some field being received on the route path, in this example it's the `counter_id`. +<1> Every Entity must be annotated with `@TypeId` with a stable identifier. This identifier should be unique among the different existing entities within a Kalix application. +<2> The `@Id` value should be unique per entity and map to some field being received on the route path, in this example it's the `counter_id`. <3> The `CounterEntity` class should extend `kalix.javasdk.valueentity.ValueEntity`. <4> The initial state of each counter is defined as 0. <5> The method is accessible as a POST endpoint on `/counter/\{counter_id\}/increase`, where `counter_id` will be its unique identifier. -Note that it matches the `entityKey` value. +Note that it matches the `@Id` value. <6> Its `increaseBy` method receives a `Number` as input and increases the counter by adding it to the current state. <7> Finally, using the Effect API, we instruct Kalix to persist the new state, and we build a reply. diff --git a/docs/src/modules/java/pages/value-entity.adoc b/docs/src/modules/java/pages/value-entity.adoc index a49226fb42..a5a8717a6d 100644 --- a/docs/src/modules/java/pages/value-entity.adoc +++ b/docs/src/modules/java/pages/value-entity.adoc @@ -41,8 +41,8 @@ Let us start by showing how to create the Value Entity: ---- include::example$java-spring-valueentity-counter/src/main/java/com/example/CounterEntity.java[tags=declarations] ---- -<1> Every Entity must be annotated with `@EntityType` with a stable name. This name should be unique among the different existing entities within a Kalix application. -<2> The `@EntityKey` value should be unique per entity and map to some field being received on the route path, in this example it's the `counter_id`. +<1> Every Entity must be annotated with `@TypeId` with a stable identifier. This identifier should be unique among the different existing entities within a Kalix application. +<2> The `@Id` value should be unique per entity and map to some field being received on the route path, in this example it's the `counter_id`. <3> The `CounterEntity` class should extend `kalix.javasdk.valueentity.ValueEntity`. <4> The initial state of each counter is defined as 0. @@ -62,7 +62,7 @@ include::example$java-spring-valueentity-counter/src/main/java/com/example/Count <5> `plusOne` increases the counter by adding 1 to the current state. <6> Finally, using the Effect API, you instruct Kalix to persist the new state, and build a reply with the wrapper object. -NOTE: The `counter_id` parameter matches the `entityKey` value. Also, for this example, we have opted to always repeat the common route `/counter/\{counter_id\}` for each command but a simpler option could be to use a `@RequestMethod("/counter/\{counter_id\}")` at class level. +NOTE: The `counter_id` parameter matches the `@Id` value. Also, for this example, we have opted to always repeat the common route `/counter/\{counter_id\}` for each command but a simpler option could be to use a `@RequestMethod("/counter/\{counter_id\}")` at class level. [#deleting-state] === Deleting state diff --git a/docs/src/modules/java/pages/workflow-entities.adoc b/docs/src/modules/java/pages/workflows.adoc similarity index 76% rename from docs/src/modules/java/pages/workflow-entities.adoc rename to docs/src/modules/java/pages/workflows.adoc index deea755f28..3670b703f4 100644 --- a/docs/src/modules/java/pages/workflow-entities.adoc +++ b/docs/src/modules/java/pages/workflows.adoc @@ -1,10 +1,10 @@ -= Implementing Workflow Entities -:page-aliases: spring:workflow.adoc, spring:workflow-entities.adoc += Implementing Workflows +:page-aliases: spring:workflow.adoc, spring:workflow-entities.adoc, java:workflow-entities.adoc :sample-url: https://github.com/lightbend/kalix-jvm-sdk/tree/main/samples/java-spring-transfer-workflow include::ROOT:partial$include.adoc[] -Implementing a business transaction that spans multiple services is one of the major challenges in distributed systems implementation. Fortunately, with Kalix ecosystem and concepts like https://docs.kalix.io/spring/actions-publishing-subscribing.html[Subscription], it's very easy to build an event driven choreography that covers a complex business process. A https://microservices.io/patterns/data/saga.html[Saga pattern] that generalizes this solution was never so easy to implement. However, for some use cases a different flavor of the Saga pattern, an orchestration, might be more suitable. That was the main driver behind a Kalix component type called a Workflow Entity. From a high-level perspective it joins the power of https://docs.kalix.io/concepts/state-model.html[Kalix Entities state model] (durability, consistency guaranties) and https://docs.kalix.io/spring/actions.html[Kalix Actions] ability to call other components and services. You can model your business process in a single place and the Workflow Entity will keep it running or rollback in case of a failure. +Implementing a business transaction that spans multiple services is one of the major challenges in distributed systems implementation. Fortunately, with Kalix ecosystem and concepts like https://docs.kalix.io/spring/actions-publishing-subscribing.html[Subscription], it's very easy to build an event driven choreography that covers a complex business process. A https://microservices.io/patterns/data/saga.html[Saga pattern] that generalizes this solution was never so easy to implement. However, for some use cases a different flavor of the Saga pattern, an orchestration, might be more suitable. That was the main driver behind a Kalix component type called a Workflow. From a high-level perspective it joins the power of https://docs.kalix.io/concepts/state-model.html[Kalix Entities state model] (durability, consistency guaranties) and https://docs.kalix.io/spring/actions.html[Kalix Actions] ability to call other components and services. You can model your business process in a single place and the Workflow will keep it running or rollback in case of a failure. == Modeling state @@ -34,29 +34,29 @@ include::example$java-spring-transfer-workflow/src/main/java/com/example/transfe Now that we have our workflow state defined, the remaining tasks can be summarized as follows: -- declare your entity and pick an entity type and key (it needs to be unique as it will be used for sharding purposes); -- define an access point (i.e. a route path) to your entity; +- declare your workflow and pick a workflow type and key (it needs to be unique as it will be used for sharding purposes); +- define an access point (i.e. a route path) to your workflow; - implement endpoint(s) to interact with the workflow (e.g. to start a workflow, or provide additional data) or retrieve its current state; - provide a workflow definition with all possible steps and transitions between them. -Let's have a look at what our transfer workflow entity will look like for the first 2 points from the above list: +Let's have a look at what our transfer workflow will look like for the first 2 points from the above list: [source,java,indent=0] .src/main/java/com/example/transfer/TransferWorkflow.java ---- include::example$java-spring-transfer-workflow/src/main/java/com/example/transfer/TransferWorkflow.java[tag=class] ---- -<1> Create a class that extends `WorkflowEntity`, where `S` is the state type this entity will store (i.e. `TransferState`). -<2> Make sure to annotate such class with `@EntityType` and pass a unique name for this entity type. -<3> Annotate such class with `@EntityKey` and pass the name of the key that will be used as the entity unique identifier. -<4> Use Spring's RequestMapping annotation to define the route to your entity. +<1> Create a class that extends `Workflow`, where `S` is the state type this workflow will store (i.e. `TransferState`). +<2> Make sure to annotate such class with `@TypeId` and pass a unique identifier for this workflow type. +<3> Annotate such class with `@Id` and pass the name of the key that will be used as the workflow instance unique identifier. +<4> Use Spring's RequestMapping annotation to define the route to your workflow. -NOTE: The EntityKey `transferId` must match a path parameter (i.e. `transferId`) and such value needs to be unique per entity. On the other hand, the EntityType `transfer` is common for all instances of this workflow entity but must be stable - cannot be changed after a production deploy - and unique across the different entity types. +NOTE: The `@Id` value `transferId` must match a path parameter (i.e. `transferId`) and such value needs to be unique per workflow. On the other hand, the `@TypeId` value `transfer` is common for all instances of this workflow but must be stable - cannot be changed after a production deploy - and unique across the different workflow types. == Starting workflow -Having created the basis of our workflow entity, we will now define how to launch a workflow with a command handler. In the example below, we define a new endpoint that will accept `StartTransfer` command and return an `Effect` to start a workflow by providing a transition to the first step. Also, we will update the state with an initial value. +Having created the basis of our workflow, we will now define how to launch a workflow with a command handler. In the example below, we define a new endpoint that will accept `StartTransfer` command and return an `Effect` to start a workflow by providing a transition to the first step. Also, we will update the state with an initial value. [source,java,indent=0] @@ -71,7 +71,7 @@ include::example$java-spring-transfer-workflow/src/main/java/com/example/transfe <5> With the `transitionTo` method, we inform that the name of the first step is `"withdraw"` and the input for this step is a `Withdraw` object. <6> The last instruction is to inform the caller that the workflow was successfully started. -IMPORTANT: For simplicity purposes, we are reusing the internal `Transfer` record as a request body. This should be a separate class and our domain state model shouldn't be exposed as an entity public `API`. +IMPORTANT: For simplicity purposes, we are reusing the internal `Transfer` record as a request body. This should be a separate class and our domain state model shouldn't be exposed as a public `API`. == Workflow definition @@ -93,7 +93,7 @@ include::example$java-spring-transfer-workflow/src/main/java/com/example/transfe == Retrieving state -To have access to the current state of the workflow entity we can use `currentState()` (similar to other entities). However, if this is the first command we are receiving for this workflow entity, the state will be `null`. We can change it by overriding the `emptyState` method. The following example shows the implementation of the read-only command handler (accessed through `GET /transfer/transferId`): +To have access to the current state of the workflow we can use `currentState()` (similar to other entities). However, if this is the first command we are receiving for this workflow, the state will be `null`. We can change it by overriding the `emptyState` method. The following example shows the implementation of the read-only command handler (accessed through `GET /transfer/transferId`): [source,java,indent=0] .src/main/java/com/example/transfer/TransferWorkflow.java @@ -110,7 +110,7 @@ A full transfer workflow source code is available {sample-url}[here, {tab-icon}, == Error handling -Design for failure is one of the key attributes of all Kalix components. Workflow Entity has the richest set of configurations from all of them. It's essential to build robust and reliable solutions. +Design for failure is one of the key attributes of all Kalix components. Workflow has the richest set of configurations from all of them. It's essential to build robust and reliable solutions. === Timeouts @@ -151,7 +151,7 @@ NOTE: In case of a workflow timeout one last failover step can be performed. Tra === Compensation -The idea behind the Workflow Entity error handling is that workflows should only fail due to unknown errors during execution. In general, you should always write your workflows so that they do not fail on any known edge cases. If you expect an error, it's better to be explicit about it, possibly with your domain types. Based on this information and the flexible Workflow Entity API you can define a compensation for any workflow step. +The idea behind the Workflow error handling is that workflows should only fail due to unknown errors during execution. In general, you should always write your workflows so that they do not fail on any known edge cases. If you expect an error, it's better to be explicit about it, possibly with your domain types. Based on this information and the flexible Workflow API you can define a compensation for any workflow step. [source,java,indent=0] .src/main/java/com/example/transfer/TransferWorkflow.java diff --git a/docs/src/modules/java/partials/entity-keys.adoc b/docs/src/modules/java/partials/entity-keys.adoc index d2364d0935..7b6bc4abb5 100644 --- a/docs/src/modules/java/partials/entity-keys.adoc +++ b/docs/src/modules/java/partials/entity-keys.adoc @@ -1,26 +1,26 @@ == Identifying the Entity -In order to interact with an Entity in Kalix, we need to assign an *entity type* and one or more *entity keys*: +In order to interact with an Entity in Kalix, we need to assign an *type id* and one or more instance *ids*: -* *entity type* is a unique identifier for all entities of a given type. To define the entity type, the entity class must be annotated with `@EntityType` and have a unique and stable name assigned. -* *entity key*, on the other hand, is unique per instance. In most cases, the entity key is passed as a path parameter of a REST request. The exception to the rule is when we request Kalix to auto-generate a key for us. In such a case, Kalix won't try to extract the key from the endpoint path. +* *type id* is a unique identifier for all entities of a given type. To define the entity type id, the entity class must be annotated with `@TypeId` and have a unique and stable identifier assigned. +* *id*, on the other hand, is unique per instance. In most cases, the entity id is passed as a path parameter of a REST request. The exception to the rule is when we request Kalix to auto-generate a id for us. In such a case, Kalix won't try to extract the id from the endpoint path. -The entity key can be defined in different ways, as detailed below. +The entity id can be defined in different ways, as detailed below. === Single keys -The most common use is to annotate the class with `@EntityKey` and assign one path variable name to it. -For instance, `@EntityKey("id")` will instruct Kalix to look up a matching path variable. For an endpoint defined with `@RequestMapping("/users/\{id}")`, Kalix will extract whatever path segment is used to replace `\{id}` and treat it as the Entity unique identifier. +The most common use is to annotate the class with `@Id` and assign one path variable name to it. +For instance, `@Id("id")` will instruct Kalix to look up a matching path variable. For an endpoint defined with `@RequestMapping("/users/\{id}")`, Kalix will extract whatever path segment is used to replace `\{id}` and treat it as the Entity unique identifier. === Composite keys -It's also possible to have composite keys. For example, `@EntityKey({"groupId", "id"})` defines a composite key made of `groupId` and `id`. In such a case, the endpoints for this entity will need to have both path variables, e.g.: `@RequestMapping("/users/\{groupId}/\{id}")`. +It's also possible to have composite keys. For example, `@Id({"groupId", "id"})` defines a composite key made of `groupId` and `id`. In such a case, the endpoints for this entity will need to have both path variables, e.g.: `@RequestMapping("/users/\{groupId}/\{id}")`. === Generated keys -Finally, you can ask Kalix to generate an Entity key, this is typically useful when creating an Entity, and the key is a surrogate key. To indicate to Kalix that an Entity key should be generated rather than extracted from the path, be sure to annotate the corresponding command method with `@GenerateEntityKey`. Typically, an Entity has only one method annotated with `@GenerateEntityKey`. The one that creates the Entity. All other methods will have `@EntityKey` annotation in order to extract the surrogate key from the endpoint path. +Finally, you can ask Kalix to generate an unique identifier, this is typically useful when creating an Entity, and the id is a surrogate id. To indicate to Kalix that an Entity id should be generated rather than extracted from the path, be sure to annotate the corresponding command method with `@GenerateId`. Typically, an Entity has only one method annotated with `@GenerateId`. The one that creates the Entity. All other methods will have `@Id` annotation in order to extract the surrogate id from the endpoint path. -It will often be necessary to access the generated entity key from inside the entities code. This can be done using the link:{attachmentsdir}/api/kalix/javasdk/EntityContext.html#entityId()[`EntityContext.entityId`{tab-icon},window="new"] method. +It will often be necessary to access the generated entity id from inside the entities code. This can be done using the link:{attachmentsdir}/api/kalix/javasdk/EntityContext.html#entityId()[`EntityContext.entityId`{tab-icon},window="new"] method. -NOTE: Kalix generates a UUID version 4 (random) keys. Only version 4 UUIDs are currently supported for generated Entity keys. \ No newline at end of file +NOTE: Kalix generates a UUID version 4 (random) keys. Only version 4 UUIDs are currently supported for generated Entity identifiers. \ No newline at end of file diff --git a/samples/java-spring-customer-registry-quickstart/src/main/java/customer/api/CustomerEntity.java b/samples/java-spring-customer-registry-quickstart/src/main/java/customer/api/CustomerEntity.java index 17900c2143..1dacd5062d 100644 --- a/samples/java-spring-customer-registry-quickstart/src/main/java/customer/api/CustomerEntity.java +++ b/samples/java-spring-customer-registry-quickstart/src/main/java/customer/api/CustomerEntity.java @@ -18,15 +18,15 @@ // tag::customer[] import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.springframework.web.bind.annotation.*; import io.grpc.Status; import customer.domain.Address; import customer.domain.Customer; -@EntityType("customer") // <1> -@EntityKey("customer_id") // <2> +@TypeId("customer") // <1> +@Id("customer_id") // <2> @RequestMapping("/customer/{customer_id}") // <3> public class CustomerEntity extends ValueEntity { // <4> diff --git a/samples/java-spring-customer-registry-views-quickstart/src/main/java/customer/api/CustomerEntity.java b/samples/java-spring-customer-registry-views-quickstart/src/main/java/customer/api/CustomerEntity.java index ce8f23f5d9..d01f8d2241 100644 --- a/samples/java-spring-customer-registry-views-quickstart/src/main/java/customer/api/CustomerEntity.java +++ b/samples/java-spring-customer-registry-views-quickstart/src/main/java/customer/api/CustomerEntity.java @@ -19,12 +19,12 @@ import customer.domain.Address; import customer.domain.Customer; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.springframework.web.bind.annotation.*; -@EntityKey("id") -@EntityType("customer") +@Id("id") +@TypeId("customer") @RequestMapping("/customer/{id}") public class CustomerEntity extends ValueEntity { diff --git a/samples/java-spring-eventsourced-counter/src/main/java/com/example/Counter.java b/samples/java-spring-eventsourced-counter/src/main/java/com/example/Counter.java index 9d44c81838..e4888710f7 100644 --- a/samples/java-spring-eventsourced-counter/src/main/java/com/example/Counter.java +++ b/samples/java-spring-eventsourced-counter/src/main/java/com/example/Counter.java @@ -17,8 +17,8 @@ package com.example; import kalix.javasdk.eventsourcedentity.EventSourcedEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.javasdk.annotations.EventHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,8 +32,8 @@ import static com.example.CounterEvent.ValueIncreased; import static com.example.CounterEvent.ValueMultiplied; -@EntityKey("id") -@EntityType("counter") +@Id("id") +@TypeId("counter") @RequestMapping("/counter/{id}") public class Counter extends EventSourcedEntity { diff --git a/samples/java-spring-eventsourced-customer-registry/src/main/java/customer/api/CustomerEntity.java b/samples/java-spring-eventsourced-customer-registry/src/main/java/customer/api/CustomerEntity.java index 89a99c7421..5bc4715df7 100644 --- a/samples/java-spring-eventsourced-customer-registry/src/main/java/customer/api/CustomerEntity.java +++ b/samples/java-spring-eventsourced-customer-registry/src/main/java/customer/api/CustomerEntity.java @@ -4,8 +4,8 @@ import customer.domain.Customer; import customer.domain.CustomerEvent; import kalix.javasdk.eventsourcedentity.EventSourcedEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.javasdk.annotations.EventHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,8 +13,8 @@ import static customer.domain.CustomerEvent.*; -@EntityKey("id") -@EntityType("customer") +@Id("id") +@TypeId("customer") @RequestMapping("/customer/{id}") public class CustomerEntity extends EventSourcedEntity { private static final Logger logger = LoggerFactory.getLogger(CustomerEntity.class); diff --git a/samples/java-spring-eventsourced-shopping-cart/src/main/java/com/example/shoppingcart/ShoppingCartEntity.java b/samples/java-spring-eventsourced-shopping-cart/src/main/java/com/example/shoppingcart/ShoppingCartEntity.java index 0bdd10475c..dd08475e28 100644 --- a/samples/java-spring-eventsourced-shopping-cart/src/main/java/com/example/shoppingcart/ShoppingCartEntity.java +++ b/samples/java-spring-eventsourced-shopping-cart/src/main/java/com/example/shoppingcart/ShoppingCartEntity.java @@ -5,8 +5,8 @@ import com.example.shoppingcart.domain.ShoppingCartEvent; import kalix.javasdk.eventsourcedentity.EventSourcedEntity; import kalix.javasdk.eventsourcedentity.EventSourcedEntityContext; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.javasdk.annotations.EventHandler; import kalix.javasdk.annotations.GenerateEntityKey; import org.springframework.web.bind.annotation.*; @@ -14,8 +14,8 @@ import java.util.Collections; // tag::class[] -@EntityKey("cartId") // <2> -@EntityType("shopping-cart") // <3> +@Id("cartId") // <2> +@TypeId("shopping-cart") // <3> @RequestMapping("/cart/{cartId}") // <4> public class ShoppingCartEntity extends EventSourcedEntity { // <1> // end::class[] diff --git a/samples/java-spring-reliable-timers/src/main/java/com/example/domain/OrderEntity.java b/samples/java-spring-reliable-timers/src/main/java/com/example/domain/OrderEntity.java index 425a04192c..8ee89da6ee 100644 --- a/samples/java-spring-reliable-timers/src/main/java/com/example/domain/OrderEntity.java +++ b/samples/java-spring-reliable-timers/src/main/java/com/example/domain/OrderEntity.java @@ -3,15 +3,15 @@ import kalix.javasdk.StatusCode.ErrorCode; import kalix.javasdk.valueentity.ValueEntity; import kalix.javasdk.valueentity.ValueEntityContext; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; // tag::order[] -@EntityKey("id") -@EntityType("order") +@Id("id") +@TypeId("order") @RequestMapping("/order/{id}") public class OrderEntity extends ValueEntity { diff --git a/samples/java-spring-shopping-cart-quickstart/src/main/java/shoppingcart/api/ShoppingCartEntity.java b/samples/java-spring-shopping-cart-quickstart/src/main/java/shoppingcart/api/ShoppingCartEntity.java index 76107d0c97..7e04a98554 100644 --- a/samples/java-spring-shopping-cart-quickstart/src/main/java/shoppingcart/api/ShoppingCartEntity.java +++ b/samples/java-spring-shopping-cart-quickstart/src/main/java/shoppingcart/api/ShoppingCartEntity.java @@ -4,8 +4,8 @@ // tag::class[] import kalix.javasdk.EntityContext; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.javasdk.annotations.EventHandler; import kalix.javasdk.eventsourcedentity.EventSourcedEntity; import kalix.javasdk.eventsourcedentity.EventSourcedEntityContext; @@ -17,8 +17,8 @@ import java.util.ArrayList; -@EntityType("shopping-cart") // <1> -@EntityKey("cartId") // <2> +@TypeId("shopping-cart") // <1> +@Id("cartId") // <2> @RequestMapping("/cart/{cartId}") // <3> public class ShoppingCartEntity extends EventSourcedEntity { // <4> diff --git a/samples/java-spring-transfer-workflow-compensation/src/main/java/com/example/transfer/TransferWorkflow.java b/samples/java-spring-transfer-workflow-compensation/src/main/java/com/example/transfer/TransferWorkflow.java index 2dabe23f17..db093f252d 100644 --- a/samples/java-spring-transfer-workflow-compensation/src/main/java/com/example/transfer/TransferWorkflow.java +++ b/samples/java-spring-transfer-workflow-compensation/src/main/java/com/example/transfer/TransferWorkflow.java @@ -7,9 +7,9 @@ import com.example.wallet.WalletEntity.WithdrawResult; import com.example.wallet.WalletEntity.WithdrawResult.WithdrawFailed; import com.example.wallet.WalletEntity.WithdrawResult.WithdrawSucceed; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; -import kalix.javasdk.workflowentity.WorkflowEntity; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; +import kalix.javasdk.workflow.Workflow; import kalix.spring.KalixClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,12 +27,12 @@ import static com.example.transfer.TransferState.TransferStatus.WITHDRAW_FAILED; import static com.example.transfer.TransferState.TransferStatus.WITHDRAW_SUCCEED; import static java.time.Duration.ofSeconds; -import static kalix.javasdk.workflowentity.WorkflowEntity.RecoverStrategy.maxRetries; +import static kalix.javasdk.workflow.Workflow.RecoverStrategy.maxRetries; -@EntityType("transfer") -@EntityKey("transferId") +@TypeId("transfer") +@Id("transferId") @RequestMapping("/transfer/{transferId}") -public class TransferWorkflow extends WorkflowEntity { +public class TransferWorkflow extends Workflow { public record Withdraw(String from, int amount) { } @@ -50,7 +50,7 @@ public TransferWorkflow(KalixClient kalixClient) { } @Override - public Workflow definition() { + public WorkflowDef definition() { Step withdraw = step("withdraw") .call(Withdraw.class, cmd -> { diff --git a/samples/java-spring-transfer-workflow-compensation/src/main/java/com/example/wallet/WalletEntity.java b/samples/java-spring-transfer-workflow-compensation/src/main/java/com/example/wallet/WalletEntity.java index 267f52a5ea..7b5597a10a 100644 --- a/samples/java-spring-transfer-workflow-compensation/src/main/java/com/example/wallet/WalletEntity.java +++ b/samples/java-spring-transfer-workflow-compensation/src/main/java/com/example/wallet/WalletEntity.java @@ -5,15 +5,15 @@ import com.example.wallet.WalletEntity.WithdrawResult.WithdrawFailed; import com.example.wallet.WalletEntity.WithdrawResult.WithdrawSucceed; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; // tag::wallet[] -@EntityKey("id") -@EntityType("wallet") +@Id("id") +@TypeId("wallet") @RequestMapping("/wallet/{id}") public class WalletEntity extends ValueEntity { diff --git a/samples/java-spring-transfer-workflow/src/main/java/com/example/transfer/TransferWorkflow.java b/samples/java-spring-transfer-workflow/src/main/java/com/example/transfer/TransferWorkflow.java index 11dc6d0a93..7aff874a8a 100644 --- a/samples/java-spring-transfer-workflow/src/main/java/com/example/transfer/TransferWorkflow.java +++ b/samples/java-spring-transfer-workflow/src/main/java/com/example/transfer/TransferWorkflow.java @@ -1,10 +1,10 @@ package com.example.transfer; import com.example.transfer.TransferState.Transfer; -import kalix.javasdk.workflowentity.WorkflowEntity; +import kalix.javasdk.workflow.Workflow; import kalix.spring.KalixClient; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; @@ -16,10 +16,10 @@ import static com.example.transfer.TransferState.TransferStatus.WITHDRAW_SUCCEED; // tag::class[] -@EntityType("transfer") // <2> -@EntityKey("transferId") // <3> +@TypeId("transfer") // <2> +@Id("transferId") // <3> @RequestMapping("/transfer/{transferId}") // <4> -public class TransferWorkflow extends WorkflowEntity { // <1> +public class TransferWorkflow extends Workflow { // <1> // end::class[] // tag::start[] @@ -44,7 +44,7 @@ public TransferWorkflow(KalixClient kalixClient) { // tag::definition[] @Override - public Workflow definition() { + public WorkflowDef definition() { Step withdraw = step("withdraw") // <1> .call(Withdraw.class, cmd -> { diff --git a/samples/java-spring-transfer-workflow/src/main/java/com/example/wallet/WalletEntity.java b/samples/java-spring-transfer-workflow/src/main/java/com/example/wallet/WalletEntity.java index ec42a61ce5..33be6c5ba8 100644 --- a/samples/java-spring-transfer-workflow/src/main/java/com/example/wallet/WalletEntity.java +++ b/samples/java-spring-transfer-workflow/src/main/java/com/example/wallet/WalletEntity.java @@ -1,15 +1,15 @@ package com.example.wallet; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; // tag::wallet[] -@EntityKey("id") -@EntityType("wallet") +@Id("id") +@TypeId("wallet") @RequestMapping("/wallet/{id}") public class WalletEntity extends ValueEntity { diff --git a/samples/java-spring-valueentity-counter/src/main/java/com/example/CounterEntity.java b/samples/java-spring-valueentity-counter/src/main/java/com/example/CounterEntity.java index 774e1436a5..11b0a46c9e 100644 --- a/samples/java-spring-valueentity-counter/src/main/java/com/example/CounterEntity.java +++ b/samples/java-spring-valueentity-counter/src/main/java/com/example/CounterEntity.java @@ -1,16 +1,16 @@ package com.example; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.javasdk.annotations.GenerateEntityKey; import org.springframework.web.bind.annotation.*; // tag::declarations[] -@EntityType("counter") // <1> -@EntityKey("counter_id") // <2> +@TypeId("counter") // <1> +@Id("counter_id") // <2> public class CounterEntity extends ValueEntity { // <3> @Override diff --git a/samples/java-spring-valueentity-customer-registry/src/main/java/customer/api/CustomerEntity.java b/samples/java-spring-valueentity-customer-registry/src/main/java/customer/api/CustomerEntity.java index 19ec5358d5..aab92f53bc 100644 --- a/samples/java-spring-valueentity-customer-registry/src/main/java/customer/api/CustomerEntity.java +++ b/samples/java-spring-valueentity-customer-registry/src/main/java/customer/api/CustomerEntity.java @@ -22,12 +22,12 @@ import customer.domain.Customer; import kalix.javasdk.StatusCode; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.springframework.web.bind.annotation.*; -@EntityType("customer") // <1> -@EntityKey("customer_id") // <2> +@TypeId("customer") // <1> +@Id("customer_id") // <2> @RequestMapping("/customer/{customer_id}") // <3> public class CustomerEntity extends ValueEntity { // <4> diff --git a/samples/java-spring-valueentity-shopping-cart/src/main/java/com/example/api/ShoppingCartEntity.java b/samples/java-spring-valueentity-shopping-cart/src/main/java/com/example/api/ShoppingCartEntity.java index bfa2f6a08d..1b99fd0f42 100644 --- a/samples/java-spring-valueentity-shopping-cart/src/main/java/com/example/api/ShoppingCartEntity.java +++ b/samples/java-spring-valueentity-shopping-cart/src/main/java/com/example/api/ShoppingCartEntity.java @@ -21,8 +21,8 @@ import io.grpc.Status; import kalix.javasdk.valueentity.ValueEntity; import kalix.javasdk.valueentity.ValueEntityContext; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.springframework.web.bind.annotation.*; import java.time.Instant; @@ -31,8 +31,8 @@ * A value entity. */ // tag::summary[] -@EntityKey("cartId") -@EntityType("shopping-cart") +@Id("cartId") +@TypeId("shopping-cart") @RequestMapping("/cart/{cartId}") // <1> public class ShoppingCartEntity extends ValueEntity { // end::summary[] diff --git a/samples/java-spring-view-store/src/main/java/store/customer/api/CustomerEntity.java b/samples/java-spring-view-store/src/main/java/store/customer/api/CustomerEntity.java index 2451310290..09b7272d23 100644 --- a/samples/java-spring-view-store/src/main/java/store/customer/api/CustomerEntity.java +++ b/samples/java-spring-view-store/src/main/java/store/customer/api/CustomerEntity.java @@ -3,16 +3,16 @@ import store.customer.domain.Address; import store.customer.domain.Customer; import kalix.javasdk.eventsourcedentity.EventSourcedEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.javasdk.annotations.EventHandler; import org.springframework.web.bind.annotation.*; import store.customer.domain.CustomerEvent; import static store.customer.domain.CustomerEvent.*; -@EntityType("customer") -@EntityKey("id") +@TypeId("customer") +@Id("id") @RequestMapping("/customer/{id}") public class CustomerEntity extends EventSourcedEntity { diff --git a/samples/java-spring-view-store/src/main/java/store/order/api/OrderEntity.java b/samples/java-spring-view-store/src/main/java/store/order/api/OrderEntity.java index 00a360bb78..10655986c1 100644 --- a/samples/java-spring-view-store/src/main/java/store/order/api/OrderEntity.java +++ b/samples/java-spring-view-store/src/main/java/store/order/api/OrderEntity.java @@ -1,15 +1,15 @@ package store.order.api; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.springframework.web.bind.annotation.*; import store.order.domain.Order; import java.time.Instant; -@EntityType("order") -@EntityKey("id") +@TypeId("order") +@Id("id") @RequestMapping("/order/{id}") public class OrderEntity extends ValueEntity { diff --git a/samples/java-spring-view-store/src/main/java/store/product/api/ProductEntity.java b/samples/java-spring-view-store/src/main/java/store/product/api/ProductEntity.java index b0bc8afac6..e3f6dc8933 100644 --- a/samples/java-spring-view-store/src/main/java/store/product/api/ProductEntity.java +++ b/samples/java-spring-view-store/src/main/java/store/product/api/ProductEntity.java @@ -3,16 +3,16 @@ import store.product.domain.Money; import store.product.domain.Product; import kalix.javasdk.eventsourcedentity.EventSourcedEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.javasdk.annotations.EventHandler; import org.springframework.web.bind.annotation.*; import store.product.domain.ProductEvent; import static store.product.domain.ProductEvent.*; -@EntityType("product") -@EntityKey("id") +@TypeId("product") +@Id("id") @RequestMapping("/product/{id}") public class ProductEntity extends EventSourcedEntity { diff --git a/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/Kalix.java b/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/Kalix.java index 236365f1af..8dcdbf53d6 100644 --- a/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/Kalix.java +++ b/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/Kalix.java @@ -38,8 +38,8 @@ import kalix.javasdk.impl.valueentity.ResolvedValueEntityFactory; import kalix.javasdk.impl.valueentity.ValueEntityService; import kalix.javasdk.impl.view.ViewService; -import kalix.javasdk.impl.workflowentity.ResolvedWorkflowEntityFactory; -import kalix.javasdk.impl.workflowentity.WorkflowEntityService; +import kalix.javasdk.impl.workflow.ResolvedWorkflowFactory; +import kalix.javasdk.impl.workflow.WorkflowService; import kalix.javasdk.replicatedentity.ReplicatedEntity; import kalix.javasdk.replicatedentity.ReplicatedEntityOptions; import kalix.javasdk.replicatedentity.ReplicatedEntityProvider; @@ -48,9 +48,9 @@ import kalix.javasdk.valueentity.ValueEntityProvider; import kalix.javasdk.view.ViewOptions; import kalix.javasdk.view.ViewProvider; -import kalix.javasdk.workflowentity.WorkflowEntity; -import kalix.javasdk.workflowentity.WorkflowEntityOptions; -import kalix.javasdk.workflowentity.WorkflowEntityProvider; +import kalix.javasdk.workflow.Workflow; +import kalix.javasdk.workflow.WorkflowOptions; +import kalix.javasdk.workflow.WorkflowProvider; import kalix.replicatedentity.ReplicatedData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -137,19 +137,19 @@ public Kalix registerEventSourcedEntity( public Kalix registerWorkflow( - WorkflowEntityFactory factory, + WorkflowFactory factory, Descriptors.ServiceDescriptor descriptor, String workflowName, - WorkflowEntityOptions workflowEntityOptions, + WorkflowOptions workflowOptions, Descriptors.FileDescriptor... additionalDescriptors) { AnySupport anySupport = newAnySupport(additionalDescriptors); - WorkflowEntityFactory resolvedFactory = - new ResolvedWorkflowEntityFactory(factory, anySupport.resolveServiceDescriptor(descriptor)); + WorkflowFactory resolvedFactory = + new ResolvedWorkflowFactory(factory, anySupport.resolveServiceDescriptor(descriptor)); return registerWorkflow(descriptor, workflowName, - workflowEntityOptions, + workflowOptions, anySupport, resolvedFactory, additionalDescriptors @@ -160,21 +160,21 @@ public Kalix registerWorkflow( public Kalix registerWorkflow( Descriptors.ServiceDescriptor descriptor, String workflowName, - WorkflowEntityOptions workflowEntityOptions, + WorkflowOptions workflowOptions, MessageCodec messageCodec, - WorkflowEntityFactory resolvedFactory, + WorkflowFactory resolvedFactory, Descriptors.FileDescriptor[] additionalDescriptors) { services.put( descriptor.getFullName(), system -> - new WorkflowEntityService( + new WorkflowService( resolvedFactory, descriptor, additionalDescriptors, messageCodec, workflowName, - workflowEntityOptions + workflowOptions ) ); @@ -508,7 +508,7 @@ public > Kalix register( } - public > Kalix register(WorkflowEntityProvider provider) { + public > Kalix register(WorkflowProvider provider) { return provider .alternativeCodec() .map( diff --git a/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/impl/WorkflowEntityFactory.java b/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/impl/WorkflowFactory.java similarity index 73% rename from sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/impl/WorkflowEntityFactory.java rename to sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/impl/WorkflowFactory.java index e747d28e2d..736dd994da 100644 --- a/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/impl/WorkflowEntityFactory.java +++ b/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/impl/WorkflowFactory.java @@ -16,10 +16,10 @@ package kalix.javasdk.impl; -import kalix.javasdk.impl.workflowentity.WorkflowEntityRouter; -import kalix.javasdk.workflowentity.WorkflowEntityContext; +import kalix.javasdk.impl.workflow.WorkflowRouter; +import kalix.javasdk.workflow.WorkflowContext; -public interface WorkflowEntityFactory { +public interface WorkflowFactory { - WorkflowEntityRouter create(WorkflowEntityContext context); + WorkflowRouter create(WorkflowContext context); } diff --git a/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/CommandContext.java b/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/CommandContext.java similarity index 84% rename from sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/CommandContext.java rename to sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/CommandContext.java index 30c3c6c0f7..39a96e32ff 100644 --- a/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/CommandContext.java +++ b/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/CommandContext.java @@ -14,12 +14,12 @@ * limitations under the License. */ -package kalix.javasdk.workflowentity; +package kalix.javasdk.workflow; import kalix.javasdk.MetadataContext; -/** A value based entity command context. */ -public interface CommandContext extends WorkflowEntityContext, MetadataContext { +/** A value based workflow command context. */ +public interface CommandContext extends WorkflowContext, MetadataContext { /** * The name of the command being executed. diff --git a/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/WorkflowEntity.java b/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/Workflow.java similarity index 94% rename from sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/WorkflowEntity.java rename to sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/Workflow.java index 4551c05ad6..a651fd4173 100644 --- a/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/WorkflowEntity.java +++ b/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/Workflow.java @@ -14,15 +14,15 @@ * limitations under the License. */ -package kalix.javasdk.workflowentity; +package kalix.javasdk.workflow; import akka.annotation.ApiMayChange; import io.grpc.Status; import kalix.javasdk.DeferredCall; import kalix.javasdk.Metadata; -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl; +import kalix.javasdk.impl.workflow.WorkflowEffectImpl; import kalix.javasdk.timer.TimerScheduler; -import kalix.javasdk.workflowentity.WorkflowEntity.RecoverStrategy.MaxRetries; +import kalix.javasdk.workflow.Workflow.RecoverStrategy.MaxRetries; import java.time.Duration; import java.util.ArrayList; @@ -36,10 +36,10 @@ import java.util.function.Supplier; /** - * @param The type of the state for this entity. + * @param The type of the state for this workflow. */ @ApiMayChange -public abstract class WorkflowEntity { +public abstract class Workflow { private Optional commandContext = Optional.empty(); @@ -69,7 +69,7 @@ public S emptyState() { * * @throws IllegalStateException if accessed outside a handler method */ - protected final kalix.javasdk.workflowentity.CommandContext commandContext() { + protected final kalix.javasdk.workflow.CommandContext commandContext() { return commandContext.orElseThrow(() -> new IllegalStateException("CommandContext is only available when handling a command.")); } @@ -124,10 +124,10 @@ protected final S currentState() { * @return A workflow definition in a form of steps and transitions between them. */ @ApiMayChange - public abstract Workflow definition(); + public abstract WorkflowDef definition(); protected final Effect.Builder effects() { - return WorkflowEntityEffectImpl.apply(); + return WorkflowEffectImpl.apply(); } /** @@ -143,7 +143,7 @@ public interface Effect { * The effect describes next processing actions, such as updating state, transition to another step * and sending a reply. * - * @param The type of the state for this entity. + * @param The type of the state for this workflow. */ interface Builder { @@ -283,7 +283,7 @@ interface PersistenceEffectBuilder { } - public static class Workflow { + public static class WorkflowDef { final private List steps = new ArrayList<>(); final private List stepConfigs = new ArrayList<>(); @@ -296,7 +296,7 @@ public static class Workflow { private Optional> stepRecoverStrategy = Optional.empty(); - private Workflow() { + private WorkflowDef() { } public Optional findByName(String name) { @@ -308,7 +308,7 @@ public Optional findByName(String name) { * * @param step A workflow step */ - public Workflow addStep(Step step) { + public WorkflowDef addStep(Step step) { addStepWithValidation(step); return this; } @@ -319,7 +319,7 @@ public Workflow addStep(Step step) { * @param step A workflow step * @param recoverStrategy A Step recovery strategy */ - public Workflow addStep(Step step, RecoverStrategy recoverStrategy) { + public WorkflowDef addStep(Step step, RecoverStrategy recoverStrategy) { addStepWithValidation(step); stepConfigs.add(new StepConfig(step.name(), step.timeout(), Optional.of(recoverStrategy))); return this; @@ -342,7 +342,7 @@ public void forEachStep(Consumer stepConsumer) { * * @param timeout Timeout duration */ - public Workflow timeout(Duration timeout) { + public WorkflowDef timeout(Duration timeout) { this.workflowTimeout = Optional.of(timeout); return this; } @@ -353,7 +353,7 @@ public Workflow timeout(Duration timeout) { * @param stepName A failover step name * @param maxRetries A recovery strategy for failover step. */ - public Workflow failoverTo(String stepName, MaxRetries maxRetries) { + public WorkflowDef failoverTo(String stepName, MaxRetries maxRetries) { this.failoverStepName = Optional.of(stepName); this.failoverMaxRetries = Optional.of(maxRetries); return this; @@ -366,7 +366,7 @@ public Workflow failoverTo(String stepName, MaxRetries maxRetries) { * @param stepInput A failover step input * @param maxRetries A recovery strategy for failover step. */ - public Workflow failoverTo(String stepName, I stepInput, MaxRetries maxRetries) { + public WorkflowDef failoverTo(String stepName, I stepInput, MaxRetries maxRetries) { this.failoverStepName = Optional.of(stepName); this.failoverStepInput = Optional.of(stepInput); this.failoverMaxRetries = Optional.of(maxRetries); @@ -377,7 +377,7 @@ public Workflow failoverTo(String stepName, I stepInput, MaxRetries maxRe * Define a default step timeout. If not set, a default value of 5 seconds is used. * Can be overridden with step configuration. */ - public Workflow defaultStepTimeout(Duration timeout) { + public WorkflowDef defaultStepTimeout(Duration timeout) { this.stepTimeout = Optional.of(timeout); return this; } @@ -385,7 +385,7 @@ public Workflow defaultStepTimeout(Duration timeout) { /** * Define a default step recovery strategy. Can be overridden with step configuration. */ - public Workflow defaultStepRecoverStrategy(RecoverStrategy recoverStrategy) { + public WorkflowDef defaultStepRecoverStrategy(RecoverStrategy recoverStrategy) { this.stepRecoverStrategy = Optional.of(recoverStrategy); return this; } @@ -424,8 +424,8 @@ public Optional getFailoverMaxRetries() { } - public Workflow workflow() { - return new Workflow<>(); + public WorkflowDef workflow() { + return new WorkflowDef<>(); } @@ -521,8 +521,8 @@ public AsyncCallStep timeout(Duration time * @return Step builder. */ @ApiMayChange - public static WorkflowEntity.StepBuilder step(String name) { - return new WorkflowEntity.StepBuilder(name); + public static Workflow.StepBuilder step(String name) { + return new Workflow.StepBuilder(name); } public static class StepConfig { diff --git a/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/WorkflowEntityContext.java b/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/WorkflowContext.java similarity index 71% rename from sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/WorkflowEntityContext.java rename to sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/WorkflowContext.java index 8bf977e0ad..e4a1dc989b 100644 --- a/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/WorkflowEntityContext.java +++ b/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/WorkflowContext.java @@ -14,8 +14,15 @@ * limitations under the License. */ -package kalix.javasdk.workflowentity; +package kalix.javasdk.workflow; -import kalix.javasdk.EntityContext; +import kalix.javasdk.Context; -public interface WorkflowEntityContext extends EntityContext {} +public interface WorkflowContext extends Context { + /** + * The id of the workflow that this context is for. + * + * @return The workflow id. + */ + String workflowId(); +} diff --git a/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/WorkflowEntityOptions.java b/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/WorkflowOptions.java similarity index 68% rename from sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/WorkflowEntityOptions.java rename to sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/WorkflowOptions.java index 956692cb65..51fe5f544c 100644 --- a/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/WorkflowEntityOptions.java +++ b/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/WorkflowOptions.java @@ -14,13 +14,13 @@ * limitations under the License. */ -package kalix.javasdk.workflowentity; +package kalix.javasdk.workflow; -import kalix.javasdk.impl.workflowentity.WorkflowEntityOptionsImpl; +import kalix.javasdk.impl.workflow.WorkflowOptionsImpl; -public interface WorkflowEntityOptions extends kalix.javasdk.impl.ComponentOptions { +public interface WorkflowOptions extends kalix.javasdk.impl.ComponentOptions { - static WorkflowEntityOptions defaults() { - return WorkflowEntityOptionsImpl.defaults(); + static WorkflowOptions defaults() { + return WorkflowOptionsImpl.defaults(); } } diff --git a/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/WorkflowEntityProvider.java b/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/WorkflowProvider.java similarity index 76% rename from sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/WorkflowEntityProvider.java rename to sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/WorkflowProvider.java index b9abb95991..f3ba8e08c7 100644 --- a/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflowentity/WorkflowEntityProvider.java +++ b/sdk/java-sdk-protobuf/src/main/java/kalix/javasdk/workflow/WorkflowProvider.java @@ -14,23 +14,23 @@ * limitations under the License. */ -package kalix.javasdk.workflowentity; +package kalix.javasdk.workflow; import com.google.protobuf.Descriptors; import kalix.javasdk.impl.MessageCodec; -import kalix.javasdk.impl.workflowentity.WorkflowEntityRouter; +import kalix.javasdk.impl.workflow.WorkflowRouter; import java.util.Optional; -public interface WorkflowEntityProvider> { +public interface WorkflowProvider> { String workflowName(); - WorkflowEntityOptions options(); + WorkflowOptions options(); Descriptors.ServiceDescriptor serviceDescriptor(); - WorkflowEntityRouter newRouter(WorkflowEntityContext context); + WorkflowRouter newRouter(WorkflowContext context); Descriptors.FileDescriptor[] additionalDescriptors(); diff --git a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/KalixRunner.scala b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/KalixRunner.scala index 1d8254f943..128c633efb 100644 --- a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/KalixRunner.scala +++ b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/KalixRunner.scala @@ -50,8 +50,8 @@ import kalix.javasdk.impl.valueentity.ValueEntitiesImpl import kalix.javasdk.impl.valueentity.ValueEntityService import kalix.javasdk.impl.view.ViewService import kalix.javasdk.impl.view.ViewsImpl -import kalix.javasdk.impl.workflowentity.WorkflowEntityImpl -import kalix.javasdk.impl.workflowentity.WorkflowEntityService +import kalix.javasdk.impl.workflow.WorkflowImpl +import kalix.javasdk.impl.workflow.WorkflowService import kalix.protocol.action.ActionsHandler import kalix.protocol.discovery.DiscoveryHandler import kalix.protocol.event_sourced_entity.EventSourcedEntitiesHandler @@ -196,9 +196,9 @@ final class KalixRunner private[javasdk] ( val valueEntityImpl = new ValueEntitiesImpl(system, entityServices, configuration) route.orElse(ValueEntitiesHandler.partial(valueEntityImpl)) - case (route, (serviceClass, workflowServices: Map[String, WorkflowEntityService] @unchecked)) - if serviceClass == classOf[WorkflowEntityService] => - val workflowImpl = new WorkflowEntityImpl(system, workflowServices) + case (route, (serviceClass, workflowServices: Map[String, WorkflowService] @unchecked)) + if serviceClass == classOf[WorkflowService] => + val workflowImpl = new WorkflowImpl(system, workflowServices) route.orElse(WorkflowEntitiesHandler.partial(workflowImpl)) case (route, (serviceClass, actionServices: Map[String, ActionService] @unchecked)) diff --git a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/EntityExceptions.scala b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/EntityExceptions.scala index de10491934..255f010ec0 100644 --- a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/EntityExceptions.scala +++ b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/EntityExceptions.scala @@ -16,15 +16,12 @@ package kalix.javasdk.impl -import io.grpc.Status -import kalix.javasdk.impl.ErrorHandling.BadRequestException -import kalix.javasdk.{ eventsourcedentity, valueentity } -import kalix.protocol.component.Failure +import kalix.javasdk.eventsourcedentity +import kalix.javasdk.valueentity import kalix.protocol.entity.Command import kalix.protocol.event_sourced_entity.EventSourcedInit import kalix.protocol.replicated_entity.ReplicatedEntityInit import kalix.protocol.value_entity.ValueEntityInit -import kalix.protocol.workflow_entity.WorkflowEntityInit object EntityExceptions { @@ -84,8 +81,6 @@ object EntityExceptions { def apply(init: ReplicatedEntityInit, message: String): EntityException = ProtocolException(init.entityId, message) - def apply(init: WorkflowEntityInit, message: String): EntityException = - ProtocolException(init.entityId, message) } def failureMessageForLog(cause: Throwable): String = cause match { diff --git a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/WorkflowExceptions.scala b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/WorkflowExceptions.scala new file mode 100644 index 0000000000..7332c07a3b --- /dev/null +++ b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/WorkflowExceptions.scala @@ -0,0 +1,71 @@ +/* + * Copyright 2021 Lightbend Inc. + * + * 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 + * + * http://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. + */ + +package kalix.javasdk.impl + +import kalix.javasdk.eventsourcedentity +import kalix.javasdk.valueentity +import kalix.protocol.entity.Command +import kalix.protocol.event_sourced_entity.EventSourcedInit +import kalix.protocol.replicated_entity.ReplicatedEntityInit +import kalix.protocol.value_entity.ValueEntityInit +import kalix.protocol.workflow_entity.WorkflowEntityInit + +object WorkflowExceptions { + + final case class WorkflowException( + workflowId: String, + commandId: Long, + commandName: String, + message: String, + cause: Option[Throwable]) + extends RuntimeException(message, cause.orNull) { + def this(workflowId: String, commandId: Long, commandName: String, message: String) = + this(workflowId, commandId, commandName, message, None) + } + + object WorkflowException { + + def apply(message: String, cause: Option[Throwable]): WorkflowException = + WorkflowException(workflowId = "", commandId = 0, commandName = "", message, cause) + + def apply(command: Command, message: String, cause: Option[Throwable]): WorkflowException = + WorkflowException(command.entityId, command.id, command.name, message, cause) + + } + + object ProtocolException { + def apply(message: String): WorkflowException = + WorkflowException(workflowId = "", commandId = 0, commandName = "", "Protocol error: " + message, None) + + def apply(command: Command, message: String): WorkflowException = + WorkflowException(command.entityId, command.id, command.name, "Protocol error: " + message, None) + + def apply(workflowId: String, message: String): WorkflowException = + WorkflowException(workflowId, commandId = 0, commandName = "", "Protocol error: " + message, None) + + def apply(init: WorkflowEntityInit, message: String): WorkflowException = + ProtocolException(init.entityId, message) + } + + def failureMessageForLog(cause: Throwable): String = cause match { + case WorkflowException(workflowId, commandId, commandName, _, _) => + val commandDescription = if (commandId != 0) s" for command [$commandName]" else "" + val workflowDescription = if (workflowId.nonEmpty) s" [$workflowId]" else "" + s"Terminating workflow$workflowDescription due to unexpected failure$commandDescription" + case _ => "Terminating workflow due to unexpected failure" + } +} diff --git a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/ResolvedWorkflowEntityFactory.scala b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/ResolvedWorkflowFactory.scala similarity index 71% rename from sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/ResolvedWorkflowEntityFactory.scala rename to sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/ResolvedWorkflowFactory.scala index 1a6e292537..cedec2a5d1 100644 --- a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/ResolvedWorkflowEntityFactory.scala +++ b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/ResolvedWorkflowFactory.scala @@ -14,19 +14,19 @@ * limitations under the License. */ -package kalix.javasdk.impl.workflowentity +package kalix.javasdk.impl.workflow import kalix.javasdk.impl.ResolvedEntityFactory import kalix.javasdk.impl.ResolvedServiceMethod -import kalix.javasdk.impl.WorkflowEntityFactory -import kalix.javasdk.workflowentity.WorkflowEntityContext +import kalix.javasdk.impl.WorkflowFactory +import kalix.javasdk.workflow.WorkflowContext -class ResolvedWorkflowEntityFactory( - delegate: WorkflowEntityFactory, +class ResolvedWorkflowFactory( + delegate: WorkflowFactory, override val resolvedMethods: Map[String, ResolvedServiceMethod[_, _]]) - extends WorkflowEntityFactory + extends WorkflowFactory with ResolvedEntityFactory { - override def create(context: WorkflowEntityContext): WorkflowEntityRouter[_, _] = + override def create(context: WorkflowContext): WorkflowRouter[_, _] = delegate.create(context) } diff --git a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityEffectImpl.scala b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/WorkflowEffectImpl.scala similarity index 67% rename from sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityEffectImpl.scala rename to sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/WorkflowEffectImpl.scala index af3bf2933d..e64978d7bf 100644 --- a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityEffectImpl.scala +++ b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/WorkflowEffectImpl.scala @@ -14,28 +14,28 @@ * limitations under the License. */ -package kalix.javasdk.impl.workflowentity +package kalix.javasdk.impl.workflow import io.grpc.Status import kalix.javasdk.Metadata -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.End -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.ErrorEffectImpl -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.NoPersistence -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.NoTransition -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.Persistence -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.PersistenceEffectBuilderImpl -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.Reply -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.StepTransition -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.Transition -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.TransitionalEffectImpl -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.UpdateState -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.Pause -import kalix.javasdk.workflowentity.WorkflowEntity.Effect -import kalix.javasdk.workflowentity.WorkflowEntity.Effect.Builder -import kalix.javasdk.workflowentity.WorkflowEntity.Effect.PersistenceEffectBuilder -import kalix.javasdk.workflowentity.WorkflowEntity.Effect.TransitionalEffect - -object WorkflowEntityEffectImpl { +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.End +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.ErrorEffectImpl +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.NoPersistence +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.NoTransition +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.Persistence +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.PersistenceEffectBuilderImpl +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.Reply +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.StepTransition +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.Transition +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.TransitionalEffectImpl +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.UpdateState +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.Pause +import kalix.javasdk.workflow.Workflow.Effect +import kalix.javasdk.workflow.Workflow.Effect.Builder +import kalix.javasdk.workflow.Workflow.Effect.PersistenceEffectBuilder +import kalix.javasdk.workflow.Workflow.Effect.TransitionalEffect + +object WorkflowEffectImpl { sealed trait Transition case class StepTransition[I](stepName: String, input: Option[I]) extends Transition @@ -52,7 +52,7 @@ object WorkflowEntityEffectImpl { case class ReplyValue[R](value: R, metadata: Metadata) extends Reply[R] case object NoReply extends Reply[Nothing] - def apply[S](): WorkflowEntityEffectImpl[S, S] = WorkflowEntityEffectImpl(NoPersistence, Pause, NoReply) + def apply[S](): WorkflowEffectImpl[S, S] = WorkflowEffectImpl(NoPersistence, Pause, NoReply) final case class PersistenceEffectBuilderImpl[S](persistence: Persistence[S]) extends PersistenceEffectBuilder[S] { @@ -73,15 +73,15 @@ object WorkflowEntityEffectImpl { extends TransitionalEffect[T] { override def thenReply[R](message: R): Effect[R] = - WorkflowEntityEffectImpl(persistence, transition, ReplyValue(message, Metadata.EMPTY)) + WorkflowEffectImpl(persistence, transition, ReplyValue(message, Metadata.EMPTY)) override def thenReply[R](message: R, metadata: Metadata): Effect[R] = - WorkflowEntityEffectImpl(persistence, transition, ReplyValue(message, metadata)) + WorkflowEffectImpl(persistence, transition, ReplyValue(message, metadata)) } final case class ErrorEffectImpl[R](description: String, status: Option[Status.Code]) extends Effect.ErrorEffect[R] } -case class WorkflowEntityEffectImpl[S, T](persistence: Persistence[S], transition: Transition, reply: Reply[T]) +case class WorkflowEffectImpl[S, T](persistence: Persistence[S], transition: Transition, reply: Reply[T]) extends Builder[S] with Effect[T] { diff --git a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityImpl.scala b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/WorkflowImpl.scala similarity index 79% rename from sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityImpl.scala rename to sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/WorkflowImpl.scala index 58fb0b7b91..4fe7210b16 100644 --- a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityImpl.scala +++ b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/WorkflowImpl.scala @@ -14,11 +14,12 @@ * limitations under the License. */ -package kalix.javasdk.impl.workflowentity +package kalix.javasdk.impl.workflow import scala.concurrent.ExecutionContext import scala.concurrent.Future import scala.util.control.NonFatal + import akka.NotUsed import akka.actor.ActorSystem import akka.stream.scaladsl.Flow @@ -26,27 +27,24 @@ import akka.stream.scaladsl.Source import com.google.protobuf.duration import com.google.protobuf.duration.Duration import io.grpc.Status -import kalix.javasdk.impl.EntityExceptions.{ failureMessageForLog, EntityException, ProtocolException } +import kalix.javasdk.impl.WorkflowExceptions.{ failureMessageForLog, ProtocolException, WorkflowException } import kalix.javasdk.impl.ErrorHandling.BadRequestException import kalix.javasdk.impl.timer.TimerSchedulerImpl -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.DeleteState -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.End -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.ErrorEffectImpl -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.NoPersistence -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.NoReply -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.NoTransition -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.Persistence -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.Reply -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.ReplyValue -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.StepTransition -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.TransitionalEffectImpl -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.UpdateState -import kalix.javasdk.impl.workflowentity.WorkflowEntityEffectImpl.Pause -import kalix.javasdk.impl.workflowentity.WorkflowEntityRouter.CommandResult -import kalix.javasdk.workflowentity.CommandContext -import kalix.javasdk.workflowentity.WorkflowEntity -import kalix.javasdk.workflowentity.WorkflowEntityContext -import kalix.javasdk.workflowentity.WorkflowEntityOptions +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.DeleteState +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.End +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.ErrorEffectImpl +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.NoPersistence +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.NoReply +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.NoTransition +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.Persistence +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.Reply +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.ReplyValue +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.StepTransition +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.TransitionalEffectImpl +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.UpdateState +import kalix.javasdk.impl.workflow.WorkflowEffectImpl.Pause +import kalix.javasdk.impl.workflow.WorkflowRouter.CommandResult +import kalix.javasdk.workflow.CommandContext import kalix.protocol.component import kalix.protocol.component.{ Reply => ProtoReply } import kalix.protocol.workflow_entity.RecoverStrategy @@ -69,32 +67,37 @@ import kalix.protocol.workflow_entity.{ StepTransition => ProtoStepTransition } import kalix.protocol.workflow_entity.{ Pause => ProtoPause } import kalix.protocol.workflow_entity.{ NoTransition => ProtoNoTransition } import org.slf4j.LoggerFactory - import java.util.Optional + import scala.jdk.OptionConverters._ +import kalix.javasdk.workflow.Workflow + +import Workflow.WorkflowDef +import kalix.javasdk.workflow.WorkflowContext +import kalix.javasdk.workflow.WorkflowOptions // FIXME these don't seem to be 'public API', more internals? import com.google.protobuf.Descriptors import kalix.javasdk.Metadata import kalix.javasdk.impl._ import scala.jdk.CollectionConverters._ -final class WorkflowEntityService( - val factory: WorkflowEntityFactory, +final class WorkflowService( + val factory: WorkflowFactory, override val descriptor: Descriptors.ServiceDescriptor, override val additionalDescriptors: Array[Descriptors.FileDescriptor], val messageCodec: MessageCodec, override val serviceName: String, - val workflowEntityOptions: Option[WorkflowEntityOptions]) + val workflowOptions: Option[WorkflowOptions]) extends Service { def this( - factory: WorkflowEntityFactory, + factory: WorkflowFactory, descriptor: Descriptors.ServiceDescriptor, additionalDescriptors: Array[Descriptors.FileDescriptor], messageCodec: MessageCodec, workflowName: String, - workflowEntityOptions: WorkflowEntityOptions) = - this(factory, descriptor, additionalDescriptors, messageCodec, workflowName, Some(workflowEntityOptions)) + workflowOptions: WorkflowOptions) = + this(factory, descriptor, additionalDescriptors, messageCodec, workflowName, Some(workflowOptions)) override def resolvedMethods: Option[Map[String, ResolvedServiceMethod[_, _]]] = factory match { @@ -104,10 +107,10 @@ final class WorkflowEntityService( override final val componentType = WorkflowEntities.name - override def componentOptions: Option[ComponentOptions] = workflowEntityOptions + override def componentOptions: Option[ComponentOptions] = workflowOptions } -final class WorkflowEntityImpl(system: ActorSystem, val services: Map[String, WorkflowEntityService]) +final class WorkflowImpl(system: ActorSystem, val services: Map[String, WorkflowService]) extends kalix.protocol.workflow_entity.WorkflowEntities { private implicit val ec: ExecutionContext = system.dispatcher @@ -137,7 +140,7 @@ final class WorkflowEntityImpl(system: ActorSystem, val services: Map[String, Wo .async private def toRecoverStrategy(messageCodec: MessageCodec)( - recoverStrategy: WorkflowEntity.RecoverStrategy[_]): RecoverStrategy = { + recoverStrategy: Workflow.RecoverStrategy[_]): RecoverStrategy = { RecoverStrategy( maxRetries = recoverStrategy.maxRetries, failoverTo = Some( @@ -149,16 +152,14 @@ final class WorkflowEntityImpl(system: ActorSystem, val services: Map[String, Wo private def toStepConfig( name: String, timeout: Optional[java.time.Duration], - recoverStrategy: Option[WorkflowEntity.RecoverStrategy[_]], + recoverStrategy: Option[Workflow.RecoverStrategy[_]], messageCodec: MessageCodec) = { val stepTimeout = timeout.toScala.map(duration.Duration(_)) val stepRecoverStrategy = recoverStrategy.map(toRecoverStrategy(messageCodec)) StepConfig(name, stepTimeout, stepRecoverStrategy) } - private def toWorkflowConfig( - workflowDefinition: WorkflowEntity.Workflow[_], - messageCodec: MessageCodec): WorkflowConfig = { + private def toWorkflowConfig(workflowDefinition: WorkflowDef[_], messageCodec: MessageCodec): WorkflowConfig = { val workflowTimeout = workflowDefinition.getWorkflowTimeout.toScala.map(Duration(_)) val stepConfigs = workflowDefinition.getStepConfigs.asScala .map(c => toStepConfig(c.stepName, c.timeout, c.recoverStrategy.toScala, messageCodec)) @@ -184,9 +185,9 @@ final class WorkflowEntityImpl(system: ActorSystem, val services: Map[String, Wo init: WorkflowEntityInit): (Flow[WorkflowStreamIn, WorkflowStreamOut, NotUsed], WorkflowStreamOut) = { val service = services.getOrElse(init.serviceName, throw ProtocolException(init, s"Service not found: ${init.serviceName}")) - val router: WorkflowEntityRouter[_, _] = - service.factory.create(new WorkflowEntityContextImpl(init.entityId, system)) - val entityId = init.entityId + val router: WorkflowRouter[_, _] = + service.factory.create(new WorkflowContextImpl(init.entityId, system)) + val workflowId = init.entityId val workflowConfig = WorkflowStreamOut( @@ -199,12 +200,9 @@ final class WorkflowEntityImpl(system: ActorSystem, val services: Map[String, Wo case None => // no initial state } - def toProtoEffect(effect: WorkflowEntity.Effect[_], commandId: Long) = { + def toProtoEffect(effect: Workflow.Effect[_], commandId: Long) = { - def effectMessage[R]( - persistence: Persistence[_], - transition: WorkflowEntityEffectImpl.Transition, - reply: Reply[R]) = { + def effectMessage[R](persistence: Persistence[_], transition: WorkflowEffectImpl.Transition, reply: Reply[R]) = { val protoEffect = persistence match { @@ -255,7 +253,7 @@ final class WorkflowEntityImpl(system: ActorSystem, val services: Map[String, Wo .withCommandId(commandId) WorkflowStreamOut(WorkflowStreamOut.Message.Effect(failureEffect)) - case WorkflowEntityEffectImpl(persistence, transition, reply) => + case WorkflowEffectImpl(persistence, transition, reply) => val protoEffect = effectMessage(persistence, transition, reply) .withCommandId(commandId) @@ -273,7 +271,7 @@ final class WorkflowEntityImpl(system: ActorSystem, val services: Map[String, Wo .map(_.message) .mapAsync(1) { - case InCommand(command) if entityId != command.entityId => + case InCommand(command) if workflowId != command.entityId => Future.failed(ProtocolException(command, "Receiving Workflow is not the intended recipient of command")) case InCommand(command) if command.payload.isEmpty => @@ -282,7 +280,7 @@ final class WorkflowEntityImpl(system: ActorSystem, val services: Map[String, Wo case InCommand(command) => val metadata = new MetadataImpl(command.metadata.map(_.entries.toVector).getOrElse(Nil)) - val context = new CommandContextImpl(entityId, command.name, command.id, metadata, system) + val context = new CommandContextImpl(workflowId, command.name, command.id, metadata, system) val timerScheduler = new TimerSchedulerImpl(service.messageCodec, system) val cmd = @@ -294,10 +292,10 @@ final class WorkflowEntityImpl(system: ActorSystem, val services: Map[String, Wo router._internalHandleCommand(command.name, cmd, context, timerScheduler) } catch { case BadRequestException(msg) => - CommandResult(WorkflowEntityEffectImpl[Any]().error(msg, Status.Code.INVALID_ARGUMENT)) - case e: EntityException => throw e + CommandResult(WorkflowEffectImpl[Any]().error(msg, Status.Code.INVALID_ARGUMENT)) + case e: WorkflowException => throw e case NonFatal(error) => - throw EntityException(command, s"Unexpected failure: $error", Some(error)) + throw WorkflowException(command, s"Unexpected failure: $error", Some(error)) } finally { context.deactivate() // Very important! } @@ -318,9 +316,9 @@ final class WorkflowEntityImpl(system: ActorSystem, val services: Map[String, Wo timerScheduler, system.dispatcher) } catch { - case e: EntityException => throw e + case e: WorkflowException => throw e case NonFatal(ex) => - throw EntityException( + throw WorkflowException( s"unexpected exception [${ex.getMessage}] while executing step [${executeStep.stepName}]", Some(ex)) } @@ -334,9 +332,9 @@ final class WorkflowEntityImpl(system: ActorSystem, val services: Map[String, Wo try { router._internalGetNextStep(cmd.stepName, cmd.result.get, service.messageCodec) } catch { - case e: EntityException => throw e + case e: WorkflowException => throw e case NonFatal(ex) => - throw EntityException( + throw WorkflowException( s"unexpected exception [${ex.getMessage}] while executing transition for step [${cmd.stepName}]", Some(ex)) } @@ -356,7 +354,7 @@ final class WorkflowEntityImpl(system: ActorSystem, val services: Map[String, Wo } private[kalix] final class CommandContextImpl( - override val entityId: String, + override val workflowId: String, override val commandName: String, override val commandId: Long, override val metadata: Metadata, @@ -365,6 +363,6 @@ private[kalix] final class CommandContextImpl( with CommandContext with ActivatableContext -private[kalix] final class WorkflowEntityContextImpl(override val entityId: String, system: ActorSystem) +private[kalix] final class WorkflowContextImpl(override val workflowId: String, system: ActorSystem) extends AbstractContext(system) - with WorkflowEntityContext + with WorkflowContext diff --git a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityOptionsImpl.scala b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/WorkflowOptionsImpl.scala similarity index 74% rename from sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityOptionsImpl.scala rename to sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/WorkflowOptionsImpl.scala index 44b3aa29fd..3d165bced5 100644 --- a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityOptionsImpl.scala +++ b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/WorkflowOptionsImpl.scala @@ -14,24 +14,24 @@ * limitations under the License. */ -package kalix.javasdk.impl.workflowentity +package kalix.javasdk.impl.workflow import java.util import java.util.Collections -import kalix.javasdk.workflowentity.WorkflowEntityOptions +import kalix.javasdk.workflow.WorkflowOptions -case class WorkflowEntityOptionsImpl(override val forwardHeaders: java.util.Set[String]) extends WorkflowEntityOptions { +case class WorkflowOptionsImpl(override val forwardHeaders: java.util.Set[String]) extends WorkflowOptions { /** * Ask Kalix to forward these headers from the incoming request as metadata headers for the incoming commands. By * default, no headers except "X-Server-Timing" are forwarded. */ - override def withForwardHeaders(headers: util.Set[String]): WorkflowEntityOptions = + override def withForwardHeaders(headers: util.Set[String]): WorkflowOptions = copy(forwardHeaders = Collections.unmodifiableSet(new util.HashSet(headers))) } -object WorkflowEntityOptionsImpl { - val defaults = new WorkflowEntityOptionsImpl(Collections.emptySet()) +object WorkflowOptionsImpl { + val defaults = new WorkflowOptionsImpl(Collections.emptySet()) } diff --git a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityRouter.scala b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/WorkflowRouter.scala similarity index 84% rename from sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityRouter.scala rename to sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/WorkflowRouter.scala index 5025e3c6e3..9e72ef65da 100644 --- a/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityRouter.scala +++ b/sdk/java-sdk-protobuf/src/main/scala/kalix/javasdk/impl/workflow/WorkflowRouter.scala @@ -14,37 +14,40 @@ * limitations under the License. */ -package kalix.javasdk.impl.workflowentity +package kalix.javasdk.impl.workflow import java.util.Optional import java.util.concurrent.CompletionStage import java.util.function.{ Function => JFunc } + import scala.compat.java8.FutureConverters.CompletionStageOps import scala.concurrent.{ ExecutionContext, Future } import scala.jdk.OptionConverters.RichOptional + import com.google.protobuf.any.{ Any => ScalaPbAny } import kalix.javasdk.DeferredCall -import kalix.javasdk.impl.EntityExceptions.EntityException import kalix.javasdk.impl.GrpcDeferredCall import kalix.javasdk.impl.MessageCodec import kalix.javasdk.impl.MetadataImpl import kalix.javasdk.impl.RestDeferredCall -import kalix.javasdk.impl.workflowentity.WorkflowEntityRouter.CommandHandlerNotFound -import kalix.javasdk.impl.workflowentity.WorkflowEntityRouter.CommandResult -import kalix.javasdk.impl.workflowentity.WorkflowEntityRouter.WorkflowStepNotFound -import kalix.javasdk.impl.workflowentity.WorkflowEntityRouter.WorkflowStepNotSupported +import kalix.javasdk.impl.workflow.WorkflowRouter.CommandHandlerNotFound +import kalix.javasdk.impl.workflow.WorkflowRouter.CommandResult +import kalix.javasdk.impl.workflow.WorkflowRouter.WorkflowStepNotFound +import kalix.javasdk.impl.workflow.WorkflowRouter.WorkflowStepNotSupported import kalix.javasdk.timer.TimerScheduler -import kalix.javasdk.workflowentity.CommandContext -import kalix.javasdk.workflowentity.WorkflowEntity.Effect -import kalix.javasdk.workflowentity.WorkflowEntity -import kalix.javasdk.workflowentity.WorkflowEntity.AsyncCallStep -import kalix.javasdk.workflowentity.WorkflowEntity.CallStep +import kalix.javasdk.workflow.CommandContext +import kalix.javasdk.workflow.Workflow +import kalix.javasdk.workflow.Workflow.Effect +import Workflow.AsyncCallStep +import Workflow.CallStep +import Workflow.WorkflowDef +import kalix.javasdk.impl.WorkflowExceptions.WorkflowException import kalix.protocol.workflow_entity.StepDeferredCall import kalix.protocol.workflow_entity.StepExecuted import kalix.protocol.workflow_entity.StepResponse -object WorkflowEntityRouter { - final case class CommandResult(effect: WorkflowEntity.Effect[_]) +object WorkflowRouter { + final case class CommandResult(effect: Workflow.Effect[_]) final case class CommandHandlerNotFound(commandName: String) extends RuntimeException { override def getMessage: String = commandName @@ -58,7 +61,7 @@ object WorkflowEntityRouter { } } -abstract class WorkflowEntityRouter[S, W <: WorkflowEntity[S]](protected val workflow: W) { +abstract class WorkflowRouter[S, W <: Workflow[S]](protected val workflow: W) { private var state: Option[S] = None @@ -72,7 +75,7 @@ abstract class WorkflowEntityRouter[S, W <: WorkflowEntity[S]](protected val wor state } - def _getWorkflowDefinition(): WorkflowEntity.Workflow[S] = { + def _getWorkflowDefinition(): WorkflowDef[S] = { workflow.definition() } @@ -97,8 +100,8 @@ abstract class WorkflowEntityRouter[S, W <: WorkflowEntity[S]](protected val wor handleCommand(commandName, stateOrEmpty(), command, context).asInstanceOf[Effect[Any]] } catch { case CommandHandlerNotFound(name) => - throw new EntityException( - context.entityId(), + throw new WorkflowException( + context.workflowId(), context.commandId(), commandName, s"No command handler found for command [$name] on ${workflow.getClass}") @@ -109,11 +112,7 @@ abstract class WorkflowEntityRouter[S, W <: WorkflowEntity[S]](protected val wor CommandResult(commandEffect) } - protected def handleCommand( - commandName: String, - state: S, - command: Any, - context: CommandContext): WorkflowEntity.Effect[_] + protected def handleCommand(commandName: String, state: S, command: Any, context: CommandContext): Workflow.Effect[_] /** INTERNAL API */ // "public" api against the impl/testkit diff --git a/sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflowentity/TransferWorkflowEntity.java b/sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflow/TransferWorkflow.java similarity index 94% rename from sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflowentity/TransferWorkflowEntity.java rename to sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflow/TransferWorkflow.java index 4a664f5ec9..14c0e1f915 100644 --- a/sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflowentity/TransferWorkflowEntity.java +++ b/sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflow/TransferWorkflow.java @@ -14,9 +14,9 @@ * limitations under the License. */ -package kalix.javasdk.workflowentity; +package kalix.javasdk.workflow; -import com.example.workflowentity.transfer.MoneyTransferApi; +import com.example.workflow.transfer.MoneyTransferApi; import com.google.protobuf.Empty; import kalix.javasdk.DeferredCall; import kalix.javasdk.impl.GrpcDeferredCall; @@ -26,7 +26,7 @@ import static io.grpc.Status.Code.INVALID_ARGUMENT; -public class TransferWorkflowEntity extends WorkflowEntity { +public class TransferWorkflow extends Workflow { @Override @@ -40,7 +40,7 @@ public MoneyTransferApi.State emptyState() { private final String remoteCallStepName = "remoteCall"; @Override - public Workflow definition() { + public WorkflowDef definition() { var remoteCall = step(remoteCallStepName) diff --git a/sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflowentity/TransferWorkflowEntityProvider.java b/sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflow/TransferWorkflowProvider.java similarity index 54% rename from sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflowentity/TransferWorkflowEntityProvider.java rename to sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflow/TransferWorkflowProvider.java index 54f83e66c9..af043657e6 100644 --- a/sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflowentity/TransferWorkflowEntityProvider.java +++ b/sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflow/TransferWorkflowProvider.java @@ -14,26 +14,26 @@ * limitations under the License. */ -package kalix.javasdk.workflowentity; +package kalix.javasdk.workflow; -import com.example.workflowentity.transfer.MoneyTransferApi; +import com.example.workflow.transfer.MoneyTransferApi; import com.google.protobuf.Descriptors; import com.google.protobuf.EmptyProto; -import kalix.javasdk.impl.workflowentity.WorkflowEntityOptionsImpl; -import kalix.javasdk.impl.workflowentity.WorkflowEntityRouter; +import kalix.javasdk.impl.workflow.WorkflowOptionsImpl; +import kalix.javasdk.impl.workflow.WorkflowRouter; import java.util.function.Function; -public class TransferWorkflowEntityProvider implements WorkflowEntityProvider { +public class TransferWorkflowProvider implements WorkflowProvider { - private final Function workflowFactory; + private final Function workflowFactory; - public static TransferWorkflowEntityProvider of(Function workflowFactory) { - return new TransferWorkflowEntityProvider(workflowFactory); + public static TransferWorkflowProvider of(Function workflowFactory) { + return new TransferWorkflowProvider(workflowFactory); } - private TransferWorkflowEntityProvider(Function workflowFactory) { + private TransferWorkflowProvider(Function workflowFactory) { this.workflowFactory = workflowFactory; } @@ -45,8 +45,8 @@ public String workflowName() { @Override - public WorkflowEntityOptions options() { - return WorkflowEntityOptionsImpl.defaults(); + public WorkflowOptions options() { + return WorkflowOptionsImpl.defaults(); } @Override @@ -55,8 +55,8 @@ public Descriptors.ServiceDescriptor serviceDescriptor() { } @Override - public WorkflowEntityRouter newRouter(WorkflowEntityContext context) { - return new TransferWorkflowEntityRouter(workflowFactory.apply(context)); + public WorkflowRouter newRouter(WorkflowContext context) { + return new TransferWorkflowRouter(workflowFactory.apply(context)); } @Override diff --git a/sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflowentity/TransferWorkflowEntityRouter.java b/sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflow/TransferWorkflowRouter.java similarity index 63% rename from sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflowentity/TransferWorkflowEntityRouter.java rename to sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflow/TransferWorkflowRouter.java index 9f33003b93..913a92a7b3 100644 --- a/sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflowentity/TransferWorkflowEntityRouter.java +++ b/sdk/java-sdk-protobuf/src/test/java/kalix/javasdk/workflow/TransferWorkflowRouter.java @@ -14,19 +14,19 @@ * limitations under the License. */ -package kalix.javasdk.workflowentity; +package kalix.javasdk.workflow; -import com.example.workflowentity.transfer.MoneyTransferApi; -import kalix.javasdk.impl.workflowentity.WorkflowEntityRouter; +import com.example.workflow.transfer.MoneyTransferApi; +import kalix.javasdk.impl.workflow.WorkflowRouter; -public class TransferWorkflowEntityRouter extends WorkflowEntityRouter { +public class TransferWorkflowRouter extends WorkflowRouter { - public TransferWorkflowEntityRouter(TransferWorkflowEntity transferWorkflow) { + public TransferWorkflowRouter(TransferWorkflow transferWorkflow) { super(transferWorkflow); } @Override - public WorkflowEntity.Effect handleCommand(String commandName, MoneyTransferApi.State state, Object command, CommandContext context) { + public Workflow.Effect handleCommand(String commandName, MoneyTransferApi.State state, Object command, CommandContext context) { switch (commandName) { case "Start": return workflow().start((MoneyTransferApi.Transfer) command); @@ -35,7 +35,7 @@ public WorkflowEntity.Effect handleCommand(String commandName, MoneyTransferApi. case "IllegalCall": return workflow().illegalCall((MoneyTransferApi.Transfer) command); default: - throw new WorkflowEntityRouter.CommandHandlerNotFound(commandName); + throw new WorkflowRouter.CommandHandlerNotFound(commandName); } } } diff --git a/sdk/java-sdk-protobuf/src/test/proto/workflowentity/transfer_workflow.proto b/sdk/java-sdk-protobuf/src/test/proto/workflow/transfer_workflow.proto similarity index 96% rename from sdk/java-sdk-protobuf/src/test/proto/workflowentity/transfer_workflow.proto rename to sdk/java-sdk-protobuf/src/test/proto/workflow/transfer_workflow.proto index cb63ced91f..a2c1a33c8c 100644 --- a/sdk/java-sdk-protobuf/src/test/proto/workflowentity/transfer_workflow.proto +++ b/sdk/java-sdk-protobuf/src/test/proto/workflow/transfer_workflow.proto @@ -16,7 +16,7 @@ syntax = "proto3"; -package com.example.workflowentity.transfer; +package com.example.workflow.transfer; option java_outer_classname = "MoneyTransferApi"; diff --git a/sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/HostAndPortSpec.scala b/sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/HostAndPortSpec.scala index 2c072cdf07..267bd5a58d 100644 --- a/sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/HostAndPortSpec.scala +++ b/sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/HostAndPortSpec.scala @@ -45,7 +45,7 @@ class HostAndPortSpec extends AnyWordSpec with Matchers { List("", "-1", "-81", "65536", "123456", "1234567890") .foreach { port => intercept[IllegalArgumentException] { - println(s">=> DEBUG: => ${HostAndPort.extract(port)}") + HostAndPort.extract(port) } } } diff --git a/sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/workflowentity/TestWorkflow.scala b/sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/workflow/TestWorkflow.scala similarity index 85% rename from sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/workflowentity/TestWorkflow.scala rename to sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/workflow/TestWorkflow.scala index 826e328a94..421dcd8907 100644 --- a/sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/workflowentity/TestWorkflow.scala +++ b/sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/workflow/TestWorkflow.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package kalix.javasdk.impl.workflowentity +package kalix.javasdk.impl.workflow import akka.actor.testkit.typed.scaladsl.LoggingTestKit import akka.actor.typed.scaladsl.adapter._ @@ -23,16 +23,16 @@ import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import kalix.javasdk.Kalix import kalix.javasdk.KalixRunner -import kalix.javasdk.workflowentity.WorkflowEntityProvider +import kalix.javasdk.workflow.WorkflowProvider object TestWorkflow { - def service(workflowProvider: WorkflowEntityProvider[_, _]): TestWorkflow = + def service(workflowProvider: WorkflowProvider[_, _]): TestWorkflow = new TestWorkflow(workflowProvider) } -class TestWorkflow(workflowProvider: WorkflowEntityProvider[_, _]) { +class TestWorkflow(workflowProvider: WorkflowProvider[_, _]) { val port: Int = SocketUtil.temporaryLocalPort() diff --git a/sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityImplSpec.scala b/sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/workflow/WorkflowImplSpec.scala similarity index 88% rename from sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityImplSpec.scala rename to sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/workflow/WorkflowImplSpec.scala index 57865d462c..679c7f9e26 100644 --- a/sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/workflowentity/WorkflowEntityImplSpec.scala +++ b/sdk/java-sdk-protobuf/src/test/scala/kalix/javasdk/impl/workflow/WorkflowImplSpec.scala @@ -14,13 +14,13 @@ * limitations under the License. */ -package kalix.javasdk.impl.workflowentity +package kalix.javasdk.impl.workflow -import com.example.workflowentity.transfer.MoneyTransferApi +import com.example.workflow.transfer.MoneyTransferApi import com.google.protobuf.Empty import io.grpc.Status.Code.INVALID_ARGUMENT import kalix.javasdk.impl.AnySupport -import kalix.javasdk.impl.workflowentity.WorkflowEntityImplSpec.MoneyTransfer +import kalix.javasdk.impl.workflow.WorkflowImplSpec.MoneyTransfer import kalix.protocol.workflow_entity.WorkflowStreamIn import kalix.testkit.TestProtocol import org.scalatest.BeforeAndAfterAll @@ -28,11 +28,11 @@ import org.scalatest.OptionValues import org.scalatest.matchers.should.Matchers import org.scalatest.wordspec.AnyWordSpec import com.google.protobuf.any.{ Any => ScalaPbAny } -import kalix.javasdk.workflowentity.TransferWorkflowEntity -import kalix.javasdk.workflowentity.TransferWorkflowEntityProvider +import kalix.javasdk.workflow.TransferWorkflow +import kalix.javasdk.workflow.TransferWorkflowProvider -class WorkflowEntityImplSpec extends AnyWordSpec with Matchers with BeforeAndAfterAll with OptionValues { - import kalix.testkit.workflowentity.WorkflowMessages._ +class WorkflowImplSpec extends AnyWordSpec with Matchers with BeforeAndAfterAll with OptionValues { + import kalix.testkit.workflow.WorkflowMessages._ private val service: TestWorkflow = MoneyTransfer.testWorkflow private val protocol: TestProtocol = TestProtocol(service.port) @@ -47,7 +47,7 @@ class WorkflowEntityImplSpec extends AnyWordSpec with Matchers with BeforeAndAft "WorkflowEntityImpl" should { "fail when first message is not init" in { - service.expectLogError("Terminating entity due to unexpected failure") { + service.expectLogError("Terminating workflow due to unexpected failure") { val workflow = protocol.workflow.connect() workflow.send(command(1, "transfer", "start")) val message = workflow.expectNext() @@ -58,7 +58,7 @@ class WorkflowEntityImplSpec extends AnyWordSpec with Matchers with BeforeAndAft } "fail when entity is sent multiple init" in { - service.expectLogError("Terminating entity [transfer] due to unexpected failure") { + service.expectLogError("Terminating workflow [transfer] due to unexpected failure") { val workflow = protocol.workflow.connect() workflow.send(init(MoneyTransfer.Name, "transfer")) workflow.expect(config()) @@ -69,7 +69,7 @@ class WorkflowEntityImplSpec extends AnyWordSpec with Matchers with BeforeAndAft } "fail when service doesn't exist" in { - service.expectLogError("Terminating entity [foo] due to unexpected failure") { + service.expectLogError("Terminating workflow [foo] due to unexpected failure") { val workflow = protocol.workflow.connect() workflow.send(init(serviceName = "DoesNotExist", entityId = "foo")) workflow.expectFailure("Unexpected error") @@ -78,7 +78,7 @@ class WorkflowEntityImplSpec extends AnyWordSpec with Matchers with BeforeAndAft } "fail when command entity id is incorrect" in { - service.expectLogError("Terminating entity [transfer2] due to unexpected failure for command [foo]") { + service.expectLogError("Terminating workflow [transfer2] due to unexpected failure for command [foo]") { val workflow = protocol.workflow.connect() workflow.send(init(MoneyTransfer.Name, "transfer")) workflow.expect(config()) @@ -89,7 +89,7 @@ class WorkflowEntityImplSpec extends AnyWordSpec with Matchers with BeforeAndAft } "fail when command payload is missing" in { - service.expectLogError("Terminating entity [transfer] due to unexpected failure for command [foo]") { + service.expectLogError("Terminating workflow [transfer] due to unexpected failure for command [foo]") { val workflow = protocol.workflow.connect() workflow.send(init(MoneyTransfer.Name, "transfer")) workflow.expect(config()) @@ -100,7 +100,7 @@ class WorkflowEntityImplSpec extends AnyWordSpec with Matchers with BeforeAndAft } "fail when entity is sent empty message" in { - service.expectLogError("Terminating entity [transfer] due to unexpected failure") { + service.expectLogError("Terminating workflow [transfer] due to unexpected failure") { val workflow = protocol.workflow.connect() workflow.send(init(MoneyTransfer.Name, "transfer")) workflow.expect(config()) @@ -111,7 +111,7 @@ class WorkflowEntityImplSpec extends AnyWordSpec with Matchers with BeforeAndAft } "fail when command handler does not exist" in { - service.expectLogError("Terminating entity [transfer] due to unexpected failure for command [foo]") { + service.expectLogError("Terminating workflow [transfer] due to unexpected failure for command [foo]") { val workflow = protocol.workflow.connect() workflow.send(init(MoneyTransfer.Name, "transfer")) workflow.expect(config()) @@ -135,7 +135,7 @@ class WorkflowEntityImplSpec extends AnyWordSpec with Matchers with BeforeAndAft } "fail when command handler throws exception" in { - service.expectLogError("Terminating entity [transfer] due to unexpected failure for command [IllegalCall]") { + service.expectLogError("Terminating workflow [transfer] due to unexpected failure for command [IllegalCall]") { val workflow = protocol.workflow.connect() workflow.send(init(MoneyTransfer.Name, "transfer")) workflow.expect(config()) @@ -249,7 +249,7 @@ class WorkflowEntityImplSpec extends AnyWordSpec with Matchers with BeforeAndAft } -object WorkflowEntityImplSpec { +object WorkflowImplSpec { object MoneyTransfer { @@ -259,7 +259,7 @@ object WorkflowEntityImplSpec { val Name: String = MoneyTransferApi.getDescriptor.findServiceByName("TransferWorkflowService").getFullName def testWorkflow: TestWorkflow = - TestWorkflow.service(TransferWorkflowEntityProvider.of(_ => new TransferWorkflowEntity())); + TestWorkflow.service(TransferWorkflowProvider.of(_ => new TransferWorkflow())); def owner(name: String) = MoneyTransferApi.Owner.newBuilder().setName(name).build() diff --git a/sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/TestProtocol.scala b/sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/TestProtocol.scala index f3ab07e84c..3eadab097f 100644 --- a/sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/TestProtocol.scala +++ b/sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/TestProtocol.scala @@ -23,7 +23,7 @@ import kalix.testkit.eventsourcedentity.TestEventSourcedProtocol import kalix.testkit.replicatedentity.TestReplicatedEntityProtocol import kalix.testkit.valueentity.TestValueEntityProtocol import com.typesafe.config.{ Config, ConfigFactory } -import kalix.testkit.workflowentity.TestWorkflowProtocol +import kalix.testkit.workflow.TestWorkflowProtocol // FIXME: should we be doing protocol-level testing in the SDK? // Copied over from Kalix framework (parts that are used here). diff --git a/sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/workflowentity/TestWorkflowProtocol.scala b/sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/workflow/TestWorkflowProtocol.scala similarity index 98% rename from sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/workflowentity/TestWorkflowProtocol.scala rename to sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/workflow/TestWorkflowProtocol.scala index 000459df16..a680047e15 100644 --- a/sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/workflowentity/TestWorkflowProtocol.scala +++ b/sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/workflow/TestWorkflowProtocol.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package kalix.testkit.workflowentity +package kalix.testkit.workflow import akka.stream.scaladsl.Source import akka.stream.testkit.TestPublisher diff --git a/sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/workflowentity/WorkflowMessages.scala b/sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/workflow/WorkflowMessages.scala similarity index 99% rename from sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/workflowentity/WorkflowMessages.scala rename to sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/workflow/WorkflowMessages.scala index 6f5c872167..d79e4905c6 100644 --- a/sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/workflowentity/WorkflowMessages.scala +++ b/sdk/java-sdk-protobuf/src/test/scala/kalix/testkit/workflow/WorkflowMessages.scala @@ -14,7 +14,7 @@ * limitations under the License. */ -package kalix.testkit.workflowentity +package kalix.testkit.workflow import com.google.protobuf.any.{ Any => ScalaPbAny } import com.google.protobuf.{ Message => JavaPbMessage } diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/eventsourcedentities/counter/CounterEntity.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/eventsourcedentities/counter/CounterEntity.java index 43aef0e495..4b17c7d8dd 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/eventsourcedentities/counter/CounterEntity.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/eventsourcedentities/counter/CounterEntity.java @@ -18,8 +18,8 @@ import kalix.javasdk.eventsourcedentity.EventSourcedEntity; import kalix.javasdk.eventsourcedentity.EventSourcedEntityContext; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.javasdk.annotations.EventHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,8 +29,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -@EntityKey("id") -@EntityType("counter-entity") +@Id("id") +@TypeId("counter-entity") @RequestMapping("/counter/{id}") public class CounterEntity extends EventSourcedEntity { diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/eventsourcedentities/headers/ForwardHeadersESEntity.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/eventsourcedentities/headers/ForwardHeadersESEntity.java index 6b5410800c..d94ec9c794 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/eventsourcedentities/headers/ForwardHeadersESEntity.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/eventsourcedentities/headers/ForwardHeadersESEntity.java @@ -18,16 +18,16 @@ import com.example.wiring.actions.echo.Message; import kalix.javasdk.eventsourcedentity.EventSourcedEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.javasdk.annotations.ForwardHeaders; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import static com.example.wiring.actions.headers.ForwardHeadersAction.SOME_HEADER; -@EntityKey("id") -@EntityType("forward-headers-es") +@Id("id") +@TypeId("forward-headers-es") @RequestMapping("/forward-headers-es/{id}") @ForwardHeaders(SOME_HEADER) public class ForwardHeadersESEntity extends EventSourcedEntity { diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/customer/CustomerEntity.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/customer/CustomerEntity.java index 147def608f..a53380fc37 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/customer/CustomerEntity.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/customer/CustomerEntity.java @@ -17,8 +17,8 @@ package com.example.wiring.valueentities.customer; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -26,8 +26,8 @@ import java.time.Instant; -@EntityType("customer") -@EntityKey("id") +@TypeId("customer") +@Id("id") @RequestMapping("/customers/{id}") public class CustomerEntity extends ValueEntity { diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/headers/ForwardHeadersValueEntity.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/headers/ForwardHeadersValueEntity.java index ce712238b5..997707016d 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/headers/ForwardHeadersValueEntity.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/headers/ForwardHeadersValueEntity.java @@ -18,16 +18,16 @@ import com.example.wiring.actions.echo.Message; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.javasdk.annotations.ForwardHeaders; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import static com.example.wiring.actions.headers.ForwardHeadersAction.SOME_HEADER; -@EntityKey("id") -@EntityType("forward-headers-ve") +@Id("id") +@TypeId("forward-headers-ve") @RequestMapping("/forward-headers-ve/{id}") @ForwardHeaders(SOME_HEADER) public class ForwardHeadersValueEntity extends ValueEntity { diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/user/AssignedCounterEntity.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/user/AssignedCounterEntity.java index 1d083503d6..465bd5538b 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/user/AssignedCounterEntity.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/user/AssignedCounterEntity.java @@ -17,14 +17,14 @@ package com.example.wiring.valueentities.user; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; -@EntityType("assigned-counter") -@EntityKey("counterId") +@TypeId("assigned-counter") +@Id("counterId") @RequestMapping("/assigned-counter") public class AssignedCounterEntity extends ValueEntity { diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/user/UserEntity.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/user/UserEntity.java index 2e13ff5b92..3f3fc8638d 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/user/UserEntity.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/valueentities/user/UserEntity.java @@ -20,14 +20,14 @@ import kalix.javasdk.eventsourcedentity.EventSourcedEntity; import kalix.javasdk.valueentity.ValueEntity; import kalix.javasdk.valueentity.ValueEntityContext; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.*; -@EntityKey("id") -@EntityType("user") +@Id("id") +@TypeId("user") @RequestMapping("/user/{id}") public class UserEntity extends ValueEntity { diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/FailingCounterEntity.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/FailingCounterEntity.java index 911c5f3ae9..8a4eb04f7d 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/FailingCounterEntity.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/FailingCounterEntity.java @@ -18,8 +18,8 @@ import com.example.wiring.eventsourcedentities.counter.Counter; import com.example.wiring.eventsourcedentities.counter.CounterEvent; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.javasdk.annotations.EventHandler; import kalix.javasdk.eventsourcedentity.EventSourcedEntity; import kalix.javasdk.eventsourcedentity.EventSourcedEntityContext; @@ -30,8 +30,8 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; -@EntityKey("id") -@EntityType("failing-counter") +@Id("id") +@TypeId("failing-counter") @RequestMapping("/failing-counter/{id}") public class FailingCounterEntity extends EventSourcedEntity { diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/TransferWorkflow.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/TransferWorkflow.java index 8a4680bbe8..b4a6d5c8b0 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/TransferWorkflow.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/TransferWorkflow.java @@ -18,9 +18,9 @@ import com.example.wiring.actions.echo.Message; import io.grpc.Status; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; -import kalix.javasdk.workflowentity.WorkflowEntity; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; +import kalix.javasdk.workflow.Workflow; import kalix.spring.KalixClient; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -28,10 +28,10 @@ import java.time.Duration; -@EntityType("transfer-workflow") -@EntityKey("transferId") +@TypeId("transfer-workflow") +@Id("transferId") @RequestMapping("/transfer/{transferId}") -public class TransferWorkflow extends WorkflowEntity { +public class TransferWorkflow extends Workflow { private final String withdrawStepName = "withdraw"; private final String depositStepName = "deposit"; @@ -43,7 +43,7 @@ public TransferWorkflow(KalixClient kalixClient) { } @Override - public Workflow definition() { + public WorkflowDef definition() { var withdraw = step(withdrawStepName) .call(Withdraw.class, cmd -> kalixClient.patch("/wallet/" + cmd.from + "/withdraw/" + cmd.amount, String.class)) diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/TransferWorkflowWithFraudDetection.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/TransferWorkflowWithFraudDetection.java index 34d6f42bb5..b7645b2caf 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/TransferWorkflowWithFraudDetection.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/TransferWorkflowWithFraudDetection.java @@ -20,24 +20,20 @@ import com.example.wiring.workflowentities.FraudDetectionResult.TransferRejected; import com.example.wiring.workflowentities.FraudDetectionResult.TransferRequiresManualAcceptation; import com.example.wiring.workflowentities.FraudDetectionResult.TransferVerified; -import kalix.javasdk.workflowentity.WorkflowEntity; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; +import kalix.javasdk.workflow.Workflow; import kalix.spring.KalixClient; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.*; import java.util.concurrent.CompletionStage; import static java.util.concurrent.CompletableFuture.completedFuture; -@EntityType("transfer-workflow-with-fraud-detection") -@EntityKey("transferId") +@TypeId("transfer-workflow-with-fraud-detection") +@Id("transferId") @RequestMapping("/transfer-with-fraud-detection/{transferId}") -public class TransferWorkflowWithFraudDetection extends WorkflowEntity { +public class TransferWorkflowWithFraudDetection extends Workflow { private final String fraudDetectionStepName = "fraud-detection"; private final String withdrawStepName = "withdraw"; @@ -50,7 +46,7 @@ public TransferWorkflowWithFraudDetection(KalixClient kalixClient) { } @Override - public Workflow definition() { + public WorkflowDef definition() { var fraudDetection = step(fraudDetectionStepName) .asyncCall(Transfer.class, this::checkFrauds) diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/TransferWorkflowWithoutInputs.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/TransferWorkflowWithoutInputs.java index 88f7fa23d3..8aecc30c52 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/TransferWorkflowWithoutInputs.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/TransferWorkflowWithoutInputs.java @@ -18,18 +18,18 @@ import com.example.wiring.actions.echo.Message; import io.grpc.Status; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; -import kalix.javasdk.workflowentity.WorkflowEntity; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; +import kalix.javasdk.workflow.Workflow; import kalix.spring.KalixClient; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -@EntityType("transfer-workflow-without-inputs") -@EntityKey("transferId") +@TypeId("transfer-workflow-without-inputs") +@Id("transferId") @RequestMapping("/transfer-without-inputs/{transferId}") -public class TransferWorkflowWithoutInputs extends WorkflowEntity { +public class TransferWorkflowWithoutInputs extends Workflow { private final String withdrawStepName = "withdraw"; private final String withdrawAsyncStepName = "withdraw-async"; @@ -43,7 +43,7 @@ public TransferWorkflowWithoutInputs(KalixClient kalixClient) { } @Override - public Workflow definition() { + public WorkflowDef definition() { var withdraw = step(withdrawStepName) .call(() -> { diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WalletEntity.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WalletEntity.java index 16e64d2a08..49acfcdcd7 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WalletEntity.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WalletEntity.java @@ -17,8 +17,8 @@ package com.example.wiring.workflowentities; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; @@ -27,8 +27,8 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; -@EntityKey("id") -@EntityType("wallet") +@Id("id") +@TypeId("wallet") @RequestMapping("/wallet/{id}") public class WalletEntity extends ValueEntity { diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithDefaultRecoverStrategy.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithDefaultRecoverStrategy.java index 4a4f77e1a0..8c3f35302e 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithDefaultRecoverStrategy.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithDefaultRecoverStrategy.java @@ -17,9 +17,9 @@ package com.example.wiring.workflowentities; import com.example.wiring.actions.echo.Message; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; -import kalix.javasdk.workflowentity.WorkflowEntity; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; +import kalix.javasdk.workflow.Workflow; import kalix.spring.KalixClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -29,12 +29,12 @@ import java.util.concurrent.CompletableFuture; import static java.time.Duration.ofSeconds; -import static kalix.javasdk.workflowentity.WorkflowEntity.RecoverStrategy.maxRetries; +import static kalix.javasdk.workflow.Workflow.RecoverStrategy.maxRetries; -@EntityType("workflow-with-default-recover-strategy") -@EntityKey("workflowId") +@TypeId("workflow-with-default-recover-strategy") +@Id("workflowId") @RequestMapping("/workflow-with-default-recover-strategy/{workflowId}") -public class WorkflowWithDefaultRecoverStrategy extends WorkflowEntity { +public class WorkflowWithDefaultRecoverStrategy extends Workflow { private final String counterStepName = "counter"; private final String counterFailoverStepName = "counter-failover"; @@ -46,7 +46,7 @@ public WorkflowWithDefaultRecoverStrategy(KalixClient kalixClient) { } @Override - public Workflow definition() { + public WorkflowDef definition() { var counterInc = step(counterStepName) .call(() -> { diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithRecoverStrategy.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithRecoverStrategy.java index 34f2029da8..7abe366b6b 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithRecoverStrategy.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithRecoverStrategy.java @@ -17,9 +17,9 @@ package com.example.wiring.workflowentities; import com.example.wiring.actions.echo.Message; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; -import kalix.javasdk.workflowentity.WorkflowEntity; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; +import kalix.javasdk.workflow.Workflow; import kalix.spring.KalixClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -29,12 +29,12 @@ import java.util.concurrent.CompletableFuture; import static java.time.Duration.ofSeconds; -import static kalix.javasdk.workflowentity.WorkflowEntity.RecoverStrategy.maxRetries; +import static kalix.javasdk.workflow.Workflow.RecoverStrategy.maxRetries; -@EntityType("workflow-with-recover-strategy") -@EntityKey("workflowId") +@TypeId("workflow-with-recover-strategy") +@Id("workflowId") @RequestMapping("/workflow-with-recover-strategy/{workflowId}") -public class WorkflowWithRecoverStrategy extends WorkflowEntity { +public class WorkflowWithRecoverStrategy extends Workflow { private final String counterStepName = "counter"; private final String counterFailoverStepName = "counter-failover"; @@ -47,7 +47,7 @@ public WorkflowWithRecoverStrategy(KalixClient kalixClient) { @Override - public Workflow definition() { + public WorkflowDef definition() { var counterInc = step(counterStepName) .call(() -> { diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithStepTimeout.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithStepTimeout.java index c51d884e6f..8c42d2a392 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithStepTimeout.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithStepTimeout.java @@ -17,9 +17,9 @@ package com.example.wiring.workflowentities; import com.example.wiring.actions.echo.Message; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; -import kalix.javasdk.workflowentity.WorkflowEntity; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; +import kalix.javasdk.workflow.Workflow; import kalix.spring.KalixClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,12 +34,12 @@ import static java.time.Duration.ofMillis; import static java.time.Duration.ofSeconds; -import static kalix.javasdk.workflowentity.WorkflowEntity.RecoverStrategy.maxRetries; +import static kalix.javasdk.workflow.Workflow.RecoverStrategy.maxRetries; -@EntityType("workflow-with-step-timeout") -@EntityKey("workflowId") +@TypeId("workflow-with-step-timeout") +@Id("workflowId") @RequestMapping("/workflow-with-step-timeout/{workflowId}") -public class WorkflowWithStepTimeout extends WorkflowEntity { +public class WorkflowWithStepTimeout extends Workflow { private Logger logger = LoggerFactory.getLogger(getClass()); private final String counterStepName = "counter"; @@ -55,7 +55,7 @@ public WorkflowWithStepTimeout(KalixClient kalixClient) { public Executor delayedExecutor = CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS); @Override - public Workflow definition() { + public WorkflowDef definition() { var counterInc = step(counterStepName) .asyncCall(() -> { diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithTimeout.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithTimeout.java index 2d5d7b84ba..a4206c27f7 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithTimeout.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithTimeout.java @@ -17,9 +17,9 @@ package com.example.wiring.workflowentities; import com.example.wiring.actions.echo.Message; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; -import kalix.javasdk.workflowentity.WorkflowEntity; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; +import kalix.javasdk.workflow.Workflow; import kalix.spring.KalixClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -33,12 +33,12 @@ import static java.time.Duration.ofMillis; import static java.time.Duration.ofSeconds; -import static kalix.javasdk.workflowentity.WorkflowEntity.RecoverStrategy.maxRetries; +import static kalix.javasdk.workflow.Workflow.RecoverStrategy.maxRetries; -@EntityType("workflow-with-timeout") -@EntityKey("workflowId") +@TypeId("workflow-with-timeout") +@Id("workflowId") @RequestMapping("/workflow-with-timeout/{workflowId}") -public class WorkflowWithTimeout extends WorkflowEntity { +public class WorkflowWithTimeout extends Workflow { private final String counterStepName = "counter"; private final String counterFailoverStepName = "counter-failover"; @@ -53,7 +53,7 @@ public WorkflowWithTimeout(KalixClient kalixClient) { public Executor delayedExecutor = CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS); @Override - public Workflow definition() { + public WorkflowDef definition() { var counterInc = step(counterStepName) .asyncCall(() -> CompletableFuture.supplyAsync(() -> "nothing", delayedExecutor)) diff --git a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithTimer.java b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithTimer.java index 6a7e493bfe..d008ffef8f 100644 --- a/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithTimer.java +++ b/sdk/java-sdk-spring/src/it/java/com/example/wiring/workflowentities/WorkflowWithTimer.java @@ -18,41 +18,36 @@ import akka.Done; import com.example.wiring.actions.echo.Message; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; -import kalix.javasdk.workflowentity.WorkflowEntity; -import kalix.javasdk.workflowentity.WorkflowEntityContext; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; +import kalix.javasdk.workflow.Workflow; +import kalix.javasdk.workflow.WorkflowContext; import kalix.spring.KalixClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.time.Duration; -@EntityType("workflow-with-timer") -@EntityKey("workflowId") +@TypeId("workflow-with-timer") +@Id("workflowId") @RequestMapping("/workflow-with-timer/{workflowId}") -public class WorkflowWithTimer extends WorkflowEntity { +public class WorkflowWithTimer extends Workflow { private final String counterStepName = "counter"; private final KalixClient kalixClient; - private final WorkflowEntityContext workflowEntityContext; + private final WorkflowContext workflowContext; - public WorkflowWithTimer(KalixClient kalixClient, WorkflowEntityContext workflowEntityContext) { + public WorkflowWithTimer(KalixClient kalixClient, WorkflowContext workflowContext) { this.kalixClient = kalixClient; - this.workflowEntityContext = workflowEntityContext; + this.workflowContext = workflowContext; } @Override - public Workflow definition() { + public WorkflowDef definition() { var counterInc = step(counterStepName) .asyncCall(() -> { - var pingWorkflow = kalixClient.put("/workflow-with-timer/" + workflowEntityContext.entityId() + "/ping", + var pingWorkflow = kalixClient.put("/workflow-with-timer/" + workflowContext.workflowId() + "/ping", new CounterScheduledValue(12), String.class); return timers().startSingleTimer("ping", Duration.ofSeconds(2), pingWorkflow); diff --git a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/EntityKey.java b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/EntityKey.java index 3aad5da66d..35184cf747 100644 --- a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/EntityKey.java +++ b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/EntityKey.java @@ -21,10 +21,13 @@ /** * Assign a key to the entity. * This should be unique per entity and map to some field being received on the route path. + * + * @deprecated Deprecated since v1.3.0. Use @Id instead. */ @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented +@Deprecated(since = "1.3.0") public @interface EntityKey { /** diff --git a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/EntityType.java b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/EntityType.java index 54d00e626e..4cdd7934db 100644 --- a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/EntityType.java +++ b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/EntityType.java @@ -24,10 +24,13 @@ * * Additionally, the name should be stable as a different name means a different entity in storage. Changing this name * will create a new class of entity and all previous instances using the old name won't be accessible anymore. + * + * @deprecated Deprecated since v1.3.0. Use @TypeId instead. */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented +@Deprecated(since = "1.3.0") public @interface EntityType { String value(); } diff --git a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/GenerateEntityKey.java b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/GenerateEntityKey.java index 3c9f9062e0..3f245c9a49 100644 --- a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/GenerateEntityKey.java +++ b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/GenerateEntityKey.java @@ -27,10 +27,13 @@ * * The generated key will be a Version 4 (random) UUID. The UUID will be generated using a cryptographically secure * random number generator. + * + * @deprecated Deprecated since v1.3.0. Use @GenerateId instead. */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented +@Deprecated(since = "1.3.0") public @interface GenerateEntityKey { Type value() default Type.VERSION_4_UUID; diff --git a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/GenerateId.java b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/GenerateId.java new file mode 100644 index 0000000000..c3884a2d82 --- /dev/null +++ b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/GenerateId.java @@ -0,0 +1,45 @@ +/* + * Copyright 2021 Lightbend Inc. + * + * 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 + * + * http://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. + */ + +package kalix.javasdk.annotations; + +import java.lang.annotation.*; + +/** + * Indicates that Kalix should generate an id when this method is invoked. + + * The generated id is accessible via the entity/workflow context supplied in the SDK. + * A method annotated with this annotation should not be annotated with {@link Id}, + * if it does, an error will be raised. + * + * The generated key will be a Version 4 (random) UUID. The UUID will be generated using a cryptographically secure + * random number generator. + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface GenerateId { + + Type value() default Type.VERSION_4_UUID; + + enum Type { + /** + * Generate a Version 4 (random) UUID. The UUID will be generated using a cryptographically secure random + * number generator. + */ + VERSION_4_UUID + } +} diff --git a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/Id.java b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/Id.java new file mode 100644 index 0000000000..17cc7c4173 --- /dev/null +++ b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/Id.java @@ -0,0 +1,31 @@ +/* + * Copyright 2021 Lightbend Inc. + * + * 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 + * + * http://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. + */ + +package kalix.javasdk.annotations; + +import java.lang.annotation.*; + +/** + * Assign an identifier to an entity or workflow instance. + * This should be unique per entity/workflow instance and map to some field being received on the route path. + */ +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Id { + + String[] value(); +} diff --git a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/TypeId.java b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/TypeId.java new file mode 100644 index 0000000000..e1cb581569 --- /dev/null +++ b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/annotations/TypeId.java @@ -0,0 +1,34 @@ +/* + * Copyright 2021 Lightbend Inc. + * + * 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 + * + * http://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. + */ + +package kalix.javasdk.annotations; + +import java.lang.annotation.*; + +/** + * Assign a type identifier to an entity or workflow. + * The type identifier should be unique among the different workflows and entities within a Kalix application. + * + * Additionally, the TypeId should be stable as a different identifier means a different workflow/entity in storage. + * Changing this identifier will create a new class of component and all previous instances using + * the old identifier won't be accessible anymore. + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface TypeId { + String value(); +} diff --git a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/eventsourced/ReflectiveEventSourcedEntityProvider.java b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/eventsourced/ReflectiveEventSourcedEntityProvider.java index fd42c7cb62..a74aedb125 100644 --- a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/eventsourced/ReflectiveEventSourcedEntityProvider.java +++ b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/eventsourced/ReflectiveEventSourcedEntityProvider.java @@ -17,18 +17,18 @@ package kalix.javasdk.eventsourced; import com.google.protobuf.Descriptors; +import kalix.javasdk.common.ForwardHeadersExtractor; import kalix.javasdk.eventsourcedentity.EventSourcedEntity; import kalix.javasdk.eventsourcedentity.EventSourcedEntityContext; import kalix.javasdk.eventsourcedentity.EventSourcedEntityOptions; import kalix.javasdk.eventsourcedentity.EventSourcedEntityProvider; -import kalix.javasdk.impl.MessageCodec; -import kalix.javasdk.impl.eventsourcedentity.EventSourcedEntityRouter; -import kalix.javasdk.annotations.EntityType; -import kalix.javasdk.common.ForwardHeadersExtractor; import kalix.javasdk.impl.ComponentDescriptor; +import kalix.javasdk.impl.ComponentDescriptorFactory$; import kalix.javasdk.impl.JsonMessageCodec; -import kalix.javasdk.impl.eventsourcedentity.EventSourcedHandlersExtractor; +import kalix.javasdk.impl.MessageCodec; import kalix.javasdk.impl.eventsourcedentity.EventSourceEntityHandlers; +import kalix.javasdk.impl.eventsourcedentity.EventSourcedEntityRouter; +import kalix.javasdk.impl.eventsourcedentity.EventSourcedHandlersExtractor; import kalix.javasdk.impl.eventsourcedentity.ReflectiveEventSourcedEntityRouter; import java.util.Optional; @@ -62,10 +62,10 @@ public ReflectiveEventSourcedEntityProvider( Function factory, EventSourcedEntityOptions options) { - EntityType annotation = entityClass.getAnnotation(EntityType.class); - if (annotation == null) + String typeId = ComponentDescriptorFactory$.MODULE$.readTypeIdValue(entityClass); + if (typeId == null) throw new IllegalArgumentException( - "Event Sourced Entity [" + entityClass.getName() + "] is missing '@EntityType' annotation"); + "Event Sourced Entity [" + entityClass.getName() + "] is missing '@TypeId' annotation"); this.eventHandlers = EventSourcedHandlersExtractor.handlersFrom(entityClass, messageCodec); if (this.eventHandlers.errors().nonEmpty()) { @@ -76,7 +76,7 @@ public ReflectiveEventSourcedEntityProvider( + this.eventHandlers.errors()); } - this.entityType = annotation.value(); + this.entityType = typeId; this.factory = factory; this.options = options.withForwardHeaders(ForwardHeadersExtractor.extractFrom(entityClass)); this.messageCodec = messageCodec; diff --git a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/valueentity/ReflectiveValueEntityProvider.java b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/valueentity/ReflectiveValueEntityProvider.java index e71758630e..c9f05edd5b 100644 --- a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/valueentity/ReflectiveValueEntityProvider.java +++ b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/valueentity/ReflectiveValueEntityProvider.java @@ -17,13 +17,13 @@ package kalix.javasdk.valueentity; import com.google.protobuf.Descriptors; -import kalix.javasdk.impl.MessageCodec; -import kalix.javasdk.impl.valueentity.ValueEntityRouter; -import kalix.javasdk.annotations.EntityType; import kalix.javasdk.common.ForwardHeadersExtractor; import kalix.javasdk.impl.ComponentDescriptor; +import kalix.javasdk.impl.ComponentDescriptorFactory$; import kalix.javasdk.impl.JsonMessageCodec; +import kalix.javasdk.impl.MessageCodec; import kalix.javasdk.impl.valueentity.ReflectiveValueEntityRouter; +import kalix.javasdk.impl.valueentity.ValueEntityRouter; import java.util.Optional; import java.util.function.Function; @@ -51,12 +51,12 @@ public ReflectiveValueEntityProvider( Function factory, ValueEntityOptions options) { - EntityType annotation = entityClass.getAnnotation(EntityType.class); + String annotation = ComponentDescriptorFactory$.MODULE$.readTypeIdValue(entityClass); if (annotation == null) throw new IllegalArgumentException( - "Value Entity [" + entityClass.getName() + "] is missing '@EntityType' annotation"); + "Value Entity [" + entityClass.getName() + "] is missing '@TypeId' annotation"); - this.entityType = annotation.value(); + this.entityType = annotation; this.factory = factory; this.options = options.withForwardHeaders(ForwardHeadersExtractor.extractFrom(entityClass)); diff --git a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/workflowentity/ReflectiveWorkflowEntityProvider.java b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/workflow/ReflectiveWorkflowProvider.java similarity index 62% rename from sdk/java-sdk-spring/src/main/java/kalix/javasdk/workflowentity/ReflectiveWorkflowEntityProvider.java rename to sdk/java-sdk-spring/src/main/java/kalix/javasdk/workflow/ReflectiveWorkflowProvider.java index e23d514e8b..e99c7d0442 100644 --- a/sdk/java-sdk-spring/src/main/java/kalix/javasdk/workflowentity/ReflectiveWorkflowEntityProvider.java +++ b/sdk/java-sdk-spring/src/main/java/kalix/javasdk/workflow/ReflectiveWorkflowProvider.java @@ -14,63 +14,63 @@ * limitations under the License. */ -package kalix.javasdk.workflowentity; +package kalix.javasdk.workflow; import com.google.protobuf.Descriptors; +import kalix.javasdk.annotations.TypeId; import kalix.javasdk.impl.MessageCodec; -import kalix.javasdk.impl.workflowentity.WorkflowEntityRouter; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.impl.workflow.WorkflowRouter; import kalix.javasdk.impl.ComponentDescriptor; import kalix.javasdk.impl.JsonMessageCodec; import kalix.javasdk.impl.StrictJsonMessageCodec; -import kalix.javasdk.impl.workflow.ReflectiveWorkflowEntityRouter; +import kalix.javasdk.impl.workflow.ReflectiveWorkflowRouter; import java.util.Optional; import java.util.function.Function; -public class ReflectiveWorkflowEntityProvider> implements WorkflowEntityProvider { +public class ReflectiveWorkflowProvider> implements WorkflowProvider { private final Class workflowClass; private final MessageCodec messageCodec; - private final Function factory; - private final WorkflowEntityOptions options; - private final String entityType; + private final Function factory; + private final WorkflowOptions options; + private final String workflowType; private final Descriptors.FileDescriptor fileDescriptor; private final Descriptors.ServiceDescriptor serviceDescriptor; private final ComponentDescriptor componentDescriptor; - public ReflectiveWorkflowEntityProvider(Class workflowClass, JsonMessageCodec messageCodec, Function factory, WorkflowEntityOptions options) { - EntityType annotation = workflowClass.getAnnotation(EntityType.class); + public ReflectiveWorkflowProvider(Class workflowClass, JsonMessageCodec messageCodec, Function factory, WorkflowOptions options) { + TypeId annotation = workflowClass.getAnnotation(TypeId.class); if (annotation == null) { throw new IllegalArgumentException( - "Workflow Entity [" + workflowClass.getName() + "] is missing '@EntityType' annotation"); + "Workflow [" + workflowClass.getName() + "] is missing '@Type' annotation"); } this.workflowClass = workflowClass; this.messageCodec = new StrictJsonMessageCodec(messageCodec); this.factory = factory; this.options = options; - this.entityType = annotation.value(); + this.workflowType = annotation.value(); this.componentDescriptor = ComponentDescriptor.descriptorFor(workflowClass, messageCodec); this.fileDescriptor = componentDescriptor.fileDescriptor(); this.serviceDescriptor = componentDescriptor.serviceDescriptor(); } - public static > ReflectiveWorkflowEntityProvider of( + public static > ReflectiveWorkflowProvider of( Class cls, JsonMessageCodec messageCodec, - Function factory) { - return new ReflectiveWorkflowEntityProvider<>( - cls, messageCodec, factory, WorkflowEntityOptions.defaults()); + Function factory) { + return new ReflectiveWorkflowProvider<>( + cls, messageCodec, factory, WorkflowOptions.defaults()); } @Override public String workflowName() { - return entityType; + return workflowType; } @Override - public WorkflowEntityOptions options() { + public WorkflowOptions options() { return options; } @@ -80,9 +80,9 @@ public Descriptors.ServiceDescriptor serviceDescriptor() { } @Override - public WorkflowEntityRouter newRouter(WorkflowEntityContext context) { + public WorkflowRouter newRouter(WorkflowContext context) { W workflow = factory.apply(context); - return new ReflectiveWorkflowEntityRouter<>( + return new ReflectiveWorkflowRouter<>( workflow, componentDescriptor.commandHandlers()); } diff --git a/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/ComponentDescriptorFactory.scala b/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/ComponentDescriptorFactory.scala index a1eaa91651..08f91624c5 100644 --- a/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/ComponentDescriptorFactory.scala +++ b/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/ComponentDescriptorFactory.scala @@ -17,10 +17,13 @@ package kalix.javasdk.impl import java.lang.annotation.Annotation +import java.lang.reflect.AnnotatedElement import java.lang.reflect.Method import java.lang.reflect.Modifier import java.lang.reflect.ParameterizedType + import scala.reflect.ClassTag + import kalix.DirectDestination import kalix.DirectSource import kalix.EventDestination @@ -38,6 +41,7 @@ import kalix.javasdk.annotations.Acl import kalix.javasdk.annotations.EntityType import kalix.javasdk.annotations.JWT import kalix.javasdk.annotations.Table +import kalix.javasdk.annotations.TypeId import kalix.javasdk.annotations.ViewId import kalix.javasdk.eventsourcedentity.EventSourcedEntity import kalix.javasdk.impl.reflection.CombinedSubscriptionServiceMethod @@ -160,10 +164,17 @@ private[impl] object ComponentDescriptorFactory { def hasJwtMethodOptions(javaMethod: Method): Boolean = javaMethod.isPublic && javaMethod.hasAnnotation[JWT] + def readTypeIdValue(annotated: AnnotatedElement) = + Option(annotated.getAnnotation(classOf[TypeId])) + .map(_.value()) + .getOrElse { + // assuming that if TypeId is not in use, EntityType will + annotated.getAnnotation(classOf[EntityType]).value() + } + def findEventSourcedEntityType(javaMethod: Method): String = { val ann = javaMethod.getAnnotation(classOf[Subscribe.EventSourcedEntity]) - val entityClass = ann.value() - entityClass.getAnnotation(classOf[EntityType]).value() + readTypeIdValue(ann.value()) } def findEventSourcedEntityClass(javaMethod: Method): Class[_ <: EventSourcedEntity[_, _]] = { @@ -190,20 +201,17 @@ private[impl] object ComponentDescriptorFactory { def findEventSourcedEntityType(clazz: Class[_]): String = { val ann = clazz.getAnnotation(classOf[Subscribe.EventSourcedEntity]) - val entityClass = ann.value() - entityClass.getAnnotation(classOf[EntityType]).value() + readTypeIdValue(ann.value()) } def findValueEntityType(javaMethod: Method): String = { val ann = javaMethod.getAnnotation(classOf[Subscribe.ValueEntity]) - val entityClass = ann.value() - entityClass.getAnnotation(classOf[EntityType]).value() + readTypeIdValue(ann.value()) } def findValueEntityType(component: Class[_]): String = { val ann = component.getAnnotation(classOf[Subscribe.ValueEntity]) - val entityClass = ann.value() - entityClass.getAnnotation(classOf[EntityType]).value() + readTypeIdValue(ann.value()) } def findHandleDeletes(javaMethod: Method): Boolean = { @@ -414,9 +422,9 @@ private[impl] object ComponentDescriptorFactory { // TODO: add more validations here // we should let users know if components are missing required annotations, - // eg: entities require @EntityType, view require @Table and @Subscription + // eg: Workflow and Entities require @TypeId, View requires @Table and @Subscription def getFactoryFor(component: Class[_]): ComponentDescriptorFactory = { - if (component.getAnnotation(classOf[EntityType]) != null) + if (component.getAnnotation(classOf[TypeId]) != null || component.getAnnotation(classOf[EntityType]) != null) EntityDescriptorFactory else if (component.getAnnotation(classOf[Table]) != null || component.getAnnotation(classOf[ViewId]) != null) ViewDescriptorFactory diff --git a/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/EntityDescriptorFactory.scala b/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/EntityDescriptorFactory.scala index 29c517c47c..a20f638d02 100644 --- a/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/EntityDescriptorFactory.scala +++ b/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/EntityDescriptorFactory.scala @@ -16,9 +16,13 @@ package kalix.javasdk.impl +import java.lang.reflect.AnnotatedElement + import kalix.KeyGeneratorMethodOptions.Generator import kalix.javasdk.annotations.EntityKey import kalix.javasdk.annotations.GenerateEntityKey +import kalix.javasdk.annotations.GenerateId +import kalix.javasdk.annotations.Id import kalix.javasdk.impl.ComponentDescriptorFactory.buildJWTOptions import kalix.javasdk.impl.reflection.KalixMethod import kalix.javasdk.impl.reflection.NameGenerator @@ -32,26 +36,35 @@ private[impl] object EntityDescriptorFactory extends ComponentDescriptorFactory messageCodec: JsonMessageCodec, nameGenerator: NameGenerator): ComponentDescriptor = { - val entityKeysOnType = { - val anno = component.getAnnotation(classOf[EntityKey]) - if (anno != null) anno.value() - else Array.empty[String] - } + def idValue(annotatedElement: AnnotatedElement) = + if (annotatedElement.getAnnotation(classOf[Id]) != null) + annotatedElement.getAnnotation(classOf[Id]).value() + else if (annotatedElement.getAnnotation(classOf[EntityKey]) != null) + annotatedElement.getAnnotation(classOf[EntityKey]).value() + else + Array.empty[String] + + def shouldGenerateId(annotatedElement: AnnotatedElement) = + if (annotatedElement.getAnnotation(classOf[GenerateId]) != null) + true + else + annotatedElement.getAnnotation(classOf[GenerateEntityKey]) != null + + val idOnType = idValue(component) val kalixMethods = RestServiceIntrospector.inspectService(component).methods.map { restMethod => - val entityKeyOnMethod = restMethod.javaMethod.getAnnotation(classOf[EntityKey]) - val generateEntityKey = restMethod.javaMethod.getAnnotation(classOf[GenerateEntityKey]) - - if (entityKeyOnMethod != null && generateEntityKey != null) + val entityIdOnMethod = idValue(restMethod.javaMethod) + val generateEntityId = shouldGenerateId(restMethod.javaMethod) + if (entityIdOnMethod.nonEmpty && generateEntityId) throw ServiceIntrospectionException( restMethod.javaMethod, - "Invalid annotation usage. Found both @EntityKey and @GenerateEntityKey annotations. " + + "Invalid annotation usage. Found both @Id and @GenerateId annotations. " + "A method can only be annotated with one of them, but not both.") val kalixMethod = - if (generateEntityKey != null) { + if (generateEntityId) { val keyGenOptions = kalix.KeyGeneratorMethodOptions.newBuilder().setKeyGenerator(Generator.VERSION_4_UUID) val methodOpts = kalix.MethodOptions.newBuilder().setEntity(keyGenOptions) KalixMethod(restMethod).withKalixOptions(methodOpts.build()) @@ -59,15 +72,15 @@ private[impl] object EntityDescriptorFactory extends ComponentDescriptorFactory } else { // keys defined on Method level get precedence val entityKeysToUse = - if (entityKeyOnMethod != null) entityKeyOnMethod.value() - else entityKeysOnType + if (entityIdOnMethod.nonEmpty) entityIdOnMethod + else idOnType if (entityKeysToUse.isEmpty) throw ServiceIntrospectionException( restMethod.javaMethod, - "Invalid command method. No @EntityKey nor @GenerateEntityKey annotations found. " + - "A command method should be annotated with either @EntityKey or @GenerateEntityKey, or " + - "an @EntityKey annotation should be present at class level.") + "Invalid command method. No @Id nor @GenerateId annotations found. " + + "A command method should be annotated with either @Id or @GenerateId, or " + + "an @Id annotation should be present at class level.") KalixMethod(restMethod, entityKeys = entityKeysToUse.toIndexedSeq) } diff --git a/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/Validations.scala b/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/Validations.scala index 1e065f2aa9..162b1fbc54 100644 --- a/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/Validations.scala +++ b/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/Validations.scala @@ -19,9 +19,10 @@ package kalix.javasdk.impl import java.lang.reflect.AnnotatedElement import java.lang.reflect.Method import java.lang.reflect.ParameterizedType + import scala.reflect.ClassTag + import kalix.javasdk.action.Action -import kalix.javasdk.annotations.EntityType import kalix.javasdk.annotations.Publish import kalix.javasdk.annotations.Query import kalix.javasdk.annotations.Subscribe @@ -397,7 +398,7 @@ object Validations { val esSubscriptions: Map[String, Seq[Method]] = eventSourcedEntitySubscription(component) match { case Some(esEntity) => - Map(esEntity.value().getAnnotation(classOf[EntityType]).value() -> methods.filter(updateMethodPredicate)) + Map(ComponentDescriptorFactory.readTypeIdValue(esEntity.value()) -> methods.filter(updateMethodPredicate)) case None => methods .filter(hasEventSourcedEntitySubscription) diff --git a/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/workflow/ReflectiveWorkflowEntityRouter.scala b/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/workflow/ReflectiveWorkflowRouter.scala similarity index 82% rename from sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/workflow/ReflectiveWorkflowEntityRouter.scala rename to sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/workflow/ReflectiveWorkflowRouter.scala index 7ca5db1519..9fe9e99e91 100644 --- a/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/workflow/ReflectiveWorkflowEntityRouter.scala +++ b/sdk/java-sdk-spring/src/main/scala/kalix/javasdk/impl/workflow/ReflectiveWorkflowRouter.scala @@ -19,14 +19,14 @@ package kalix.javasdk.impl.workflow import com.google.protobuf.any.{ Any => ScalaPbAny } import kalix.javasdk.impl.CommandHandler import kalix.javasdk.impl.InvocationContext -import kalix.javasdk.impl.workflowentity.WorkflowEntityRouter -import kalix.javasdk.workflowentity.CommandContext -import kalix.javasdk.workflowentity.WorkflowEntity +import kalix.javasdk.impl.workflow.WorkflowRouter +import kalix.javasdk.workflow.CommandContext +import kalix.javasdk.workflow.Workflow -class ReflectiveWorkflowEntityRouter[S, W <: WorkflowEntity[S]]( +class ReflectiveWorkflowRouter[S, W <: Workflow[S]]( override protected val workflow: W, commandHandlers: Map[String, CommandHandler]) - extends WorkflowEntityRouter[S, W](workflow) { + extends WorkflowRouter[S, W](workflow) { private def commandHandlerLookup(commandName: String) = commandHandlers.getOrElse( @@ -37,7 +37,7 @@ class ReflectiveWorkflowEntityRouter[S, W <: WorkflowEntity[S]]( commandName: String, state: S, command: Any, - commandContext: CommandContext): WorkflowEntity.Effect[_] = { + commandContext: CommandContext): Workflow.Effect[_] = { workflow._internalSetCurrentState(state) @@ -53,7 +53,7 @@ class ReflectiveWorkflowEntityRouter[S, W <: WorkflowEntity[S]]( commandHandler .getInvoker(inputTypeUrl) .invoke(workflow, invocationContext) - .asInstanceOf[WorkflowEntity.Effect[_]] + .asInstanceOf[Workflow.Effect[_]] } } diff --git a/sdk/java-sdk-spring/src/main/scala/kalix/spring/impl/KalixSpringApplication.scala b/sdk/java-sdk-spring/src/main/scala/kalix/spring/impl/KalixSpringApplication.scala index bcbcf050f7..bc4211601c 100644 --- a/sdk/java-sdk-spring/src/main/scala/kalix/spring/impl/KalixSpringApplication.scala +++ b/sdk/java-sdk-spring/src/main/scala/kalix/spring/impl/KalixSpringApplication.scala @@ -54,10 +54,10 @@ import kalix.javasdk.view.ReflectiveViewProvider import kalix.javasdk.view.View import kalix.javasdk.view.ViewCreationContext import kalix.javasdk.view.ViewProvider -import kalix.javasdk.workflowentity.ReflectiveWorkflowEntityProvider -import kalix.javasdk.workflowentity.WorkflowEntity -import kalix.javasdk.workflowentity.WorkflowEntityContext -import kalix.javasdk.workflowentity.WorkflowEntityProvider +import kalix.javasdk.workflow.ReflectiveWorkflowProvider +import kalix.javasdk.workflow.Workflow +import kalix.javasdk.workflow.WorkflowContext +import kalix.javasdk.workflow.WorkflowProvider import kalix.spring.KalixClient import kalix.spring.WebClientProvider import kalix.spring.impl.KalixSpringApplication.ActionCreationContextFactoryBean @@ -90,7 +90,7 @@ object KalixSpringApplication { val kalixComponents: Seq[Class[_]] = classOf[Action] :: classOf[EventSourcedEntity[_, _]] :: - classOf[WorkflowEntity[_]] :: + classOf[Workflow[_]] :: classOf[ValueEntity[_]] :: classOf[ReplicatedEntity[_]] :: classOf[View[_]] :: @@ -214,7 +214,7 @@ object KalixSpringApplication { override def isSingleton: Boolean = false // never!! } - object WorkflowContextFactoryBean extends ThreadLocalFactoryBean[WorkflowEntityContext] { + object WorkflowContextFactoryBean extends ThreadLocalFactoryBean[WorkflowContext] { override def isSingleton: Boolean = false // never!! } @@ -316,9 +316,9 @@ case class KalixSpringApplication(applicationContext: ApplicationContext, config kalixClient.registerComponent(esEntity.serviceDescriptor()) } - if (classOf[WorkflowEntity[_]].isAssignableFrom(clz)) { + if (classOf[Workflow[_]].isAssignableFrom(clz)) { logger.info(s"Registering Workflow provider for [${clz.getName}]") - val workflow = workflowProvider(clz.asInstanceOf[Class[WorkflowEntity[Nothing]]]) + val workflow = workflowProvider(clz.asInstanceOf[Class[Workflow[Nothing]]]) kalix.register(workflow) kalixClient.registerComponent(workflow.serviceDescriptor()) } @@ -407,12 +407,12 @@ case class KalixSpringApplication(applicationContext: ApplicationContext, config kalixBeanFactory.getBean(clz) }) - private def workflowProvider[S, E <: WorkflowEntity[S]](clz: Class[E]): WorkflowEntityProvider[S, E] = { - ReflectiveWorkflowEntityProvider.of( + private def workflowProvider[S, E <: Workflow[S]](clz: Class[E]): WorkflowProvider[S, E] = { + ReflectiveWorkflowProvider.of( clz, messageCodec, context => { - if (hasContextConstructor(clz, classOf[WorkflowEntityContext])) { + if (hasContextConstructor(clz, classOf[WorkflowContext])) { WorkflowContextFactoryBean.set(context) } @@ -434,10 +434,10 @@ case class KalixSpringApplication(applicationContext: ApplicationContext, config workflowEntity .definition() .forEachStep { - case asyncCallStep: WorkflowEntity.AsyncCallStep[_, _, _] => + case asyncCallStep: Workflow.AsyncCallStep[_, _, _] => messageCodec.lookupTypeHint(asyncCallStep.callInputClass) messageCodec.lookupTypeHint(asyncCallStep.transitionInputClass) - case callStep: WorkflowEntity.CallStep[_, _, _, _] => + case callStep: Workflow.CallStep[_, _, _, _] => messageCodec.lookupTypeHint(callStep.callInputClass) messageCodec.lookupTypeHint(callStep.transitionInputClass) } diff --git a/sdk/java-sdk-spring/src/test/java/kalix/spring/badwiring/eventsourced/IllDefinedEventSourcedEntity.java b/sdk/java-sdk-spring/src/test/java/kalix/spring/badwiring/eventsourced/IllDefinedEventSourcedEntity.java index a0a1f60b8e..452818a25e 100644 --- a/sdk/java-sdk-spring/src/test/java/kalix/spring/badwiring/eventsourced/IllDefinedEventSourcedEntity.java +++ b/sdk/java-sdk-spring/src/test/java/kalix/spring/badwiring/eventsourced/IllDefinedEventSourcedEntity.java @@ -17,11 +17,11 @@ package kalix.spring.badwiring.eventsourced; import kalix.javasdk.eventsourcedentity.EventSourcedEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.springframework.stereotype.Component; -@EntityKey("id") -@EntityType("test") +@Id("id") +@TypeId("test") @Component public class IllDefinedEventSourcedEntity extends EventSourcedEntity {} diff --git a/sdk/java-sdk-spring/src/test/java/kalix/spring/badwiring/valueentity/IllDefinedValueEntity.java b/sdk/java-sdk-spring/src/test/java/kalix/spring/badwiring/valueentity/IllDefinedValueEntity.java index 1bfd88d4da..223d327447 100644 --- a/sdk/java-sdk-spring/src/test/java/kalix/spring/badwiring/valueentity/IllDefinedValueEntity.java +++ b/sdk/java-sdk-spring/src/test/java/kalix/spring/badwiring/valueentity/IllDefinedValueEntity.java @@ -17,11 +17,11 @@ package kalix.spring.badwiring.valueentity; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.springframework.stereotype.Component; -@EntityKey("id") -@EntityType("test") +@Id("id") +@TypeId("test") @Component public class IllDefinedValueEntity extends ValueEntity {} diff --git a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/eventsourcedentity/EventSourcedEntitiesTestModels.java b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/eventsourcedentity/EventSourcedEntitiesTestModels.java index 42d89965fb..5cc2b81cb6 100644 --- a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/eventsourcedentity/EventSourcedEntitiesTestModels.java +++ b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/eventsourcedentity/EventSourcedEntitiesTestModels.java @@ -22,8 +22,8 @@ public class EventSourcedEntitiesTestModels { - @EntityKey("id") - @EntityType("employee") + @Id("id") + @TypeId("employee") @RequestMapping("/employee/{id}") public static class EmployeeEntity extends EventSourcedEntity { @@ -41,8 +41,8 @@ public Employee onEvent(EmployeeEvent event) { } } - @EntityKey("id") - @EntityType("counter-entity") + @Id("id") + @TypeId("counter-entity") @RequestMapping("/eventsourced/{id}") public static class CounterEventSourcedEntity extends EventSourcedEntity { @@ -76,46 +76,46 @@ private Integer privateMethodSimilarSignature(Integer event) { } - @EntityType("counter") + @TypeId("counter") public static class CounterEventSourcedEntityWithEntityKeyOnMethod extends EventSourcedEntity { - @EntityKey("id") + @Id("id") @GetMapping("/eventsourced/{id}/int/{number}") public Integer getInteger(@PathVariable Integer number) { return number; } } - @EntityKey("id") - @EntityType("counter") + @Id("id") + @TypeId("counter") public static class CounterEventSourcedEntityWithEntityKeyMethodOverride extends EventSourcedEntity { - @EntityKey("counter_id") + @Id("counter_id") @GetMapping("/eventsourced/{counter_id}/int/{number}") public Integer getInteger(@PathVariable Integer number) { return number; } } - @EntityType("counter") + @TypeId("counter") public static class CounterEventSourcedEntityWithEntityKeyGenerator extends EventSourcedEntity { - @GenerateEntityKey + @GenerateId @PutMapping("/eventsourced/int/{number}") public Integer getInteger(@PathVariable Integer number) { return number; } } - @EntityType("counter") + @TypeId("counter") public static class IllDefinedEntityWithEntityKeyGeneratorAndEntityKey extends EventSourcedEntity { - @GenerateEntityKey - @EntityKey("id") + @GenerateId + @Id("id") @GetMapping("/eventsourced/{id}/int/{number}") public Integer getInteger(@PathVariable Integer number) { return number; } } - @EntityType("counter") + @TypeId("counter") public static class IllDefinedEntityWithoutEntityKeyGeneratorNorEntityKey extends EventSourcedEntity { @GetMapping("/eventsourced/{id}/int/{number}") public Integer getInteger(@PathVariable Integer number) { @@ -123,8 +123,8 @@ public Integer getInteger(@PathVariable Integer number) { } } - @EntityKey("id") - @EntityType("counter") + @Id("id") + @TypeId("counter") @RequestMapping("/eventsourced/{id}") public static class CounterEventSourcedEntityWithJWT extends EventSourcedEntity { @@ -145,8 +145,8 @@ public Integer changeInteger(@PathVariable Integer number) { } } - @EntityKey("id") - @EntityType("counter") + @Id("id") + @TypeId("counter") public static class ErrorDuplicatedEventsEntity extends EventSourcedEntity { @EventHandler @@ -165,8 +165,8 @@ public Integer receivedIntegerEventDup(Integer event) { } } - @EntityKey("id") - @EntityType("counter") + @Id("id") + @TypeId("counter") public static class ErrorWrongSignaturesEntity extends EventSourcedEntity { @EventHandler @@ -180,8 +180,8 @@ public Integer receivedIntegerEventAndString(Integer event, String s1) { } } - @EntityKey("id") - @EntityType("employee") + @Id("id") + @TypeId("employee") @RequestMapping("/employee/{id}") public static class EmployeeEntityWithMissingHandler extends EventSourcedEntity { @@ -198,16 +198,16 @@ public Employee onEvent(EmployeeEvent.EmployeeCreated created) { } } - @EntityKey("id") - @EntityType("counter") + @Id("id") + @TypeId("counter") @Acl(allow = @Acl.Matcher(service = "test")) public static class EventSourcedEntityWithServiceLevelAcl extends EventSourcedEntity { } - @EntityKey("id") - @EntityType("counter") + @Id("id") + @TypeId("counter") @RequestMapping("/employee/{id}") public static class EventSourcedEntityWithMethodLevelAcl extends EventSourcedEntity { @PostMapping diff --git a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/AssignedCounter.java b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/AssignedCounter.java index 5487272cda..b4177c1437 100644 --- a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/AssignedCounter.java +++ b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/AssignedCounter.java @@ -17,15 +17,15 @@ package kalix.spring.testmodels.valueentity; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.spring.testmodels.Done; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; -@EntityType("assigned-counter") -@EntityKey("counterId") +@TypeId("assigned-counter") +@Id("counterId") @RequestMapping("/assigned-counter") public class AssignedCounter extends ValueEntity { diff --git a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/Counter.java b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/Counter.java index 19bfb4863c..dbaceeed12 100644 --- a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/Counter.java +++ b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/Counter.java @@ -17,8 +17,8 @@ package kalix.spring.testmodels.valueentity; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.spring.testmodels.Number; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,8 +27,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -@EntityKey("counterId") -@EntityType("ve-counter") +@Id("counterId") +@TypeId("ve-counter") @RequestMapping("/counter") public class Counter extends ValueEntity { diff --git a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/TimeTrackerEntity.java b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/TimeTrackerEntity.java index 3d634917d3..7a9f6855ea 100644 --- a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/TimeTrackerEntity.java +++ b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/TimeTrackerEntity.java @@ -17,8 +17,8 @@ package kalix.spring.testmodels.valueentity; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -27,8 +27,8 @@ import java.util.ArrayList; import java.util.List; -@EntityKey("timerId") -@EntityType("timer") +@Id("timerId") +@TypeId("timer") @RequestMapping("/timer/{timerId}") public class TimeTrackerEntity extends ValueEntity { diff --git a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/UserEntity.java b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/UserEntity.java index aa8e159fee..9a3563d8f2 100644 --- a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/UserEntity.java +++ b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/UserEntity.java @@ -17,15 +17,15 @@ package kalix.spring.testmodels.valueentity; import kalix.javasdk.valueentity.ValueEntity; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.spring.testmodels.Done; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -@EntityKey("id") -@EntityType("user") +@Id("id") +@TypeId("user") @RequestMapping("/user/{id}") public class UserEntity extends ValueEntity { @Override diff --git a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/ValueEntitiesTestModels.java b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/ValueEntitiesTestModels.java index 3782d8a053..0c7490884a 100644 --- a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/ValueEntitiesTestModels.java +++ b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/valueentity/ValueEntitiesTestModels.java @@ -18,8 +18,8 @@ import kalix.javasdk.valueentity.ValueEntity; import kalix.javasdk.annotations.Acl; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; +import kalix.javasdk.annotations.Id; +import kalix.javasdk.annotations.TypeId; import kalix.spring.testmodels.Done; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -30,8 +30,8 @@ public class ValueEntitiesTestModels { - @EntityKey( {"userId", "cartId"}) - @EntityType("user") + @Id( {"userId", "cartId"}) + @TypeId("user") @RequestMapping("/user/{userId}/{cartId}") public static class PostWithEntityKeys extends ValueEntity { @Override @@ -45,8 +45,8 @@ public ValueEntity.Effect createEntity(@RequestBody CreateUser createUser) } } - @EntityKey({"userId", "cartId"}) - @EntityType("user") + @Id({"userId", "cartId"}) + @TypeId("user") @RequestMapping() public static class GetWithQueryParams extends ValueEntity { @Override @@ -71,14 +71,14 @@ public ValueEntity.Effect getUser(@RequestParam String someParam, @Request } } - @EntityKey( {"userId", "cartId"}) - @EntityType("user") + @Id( {"userId", "cartId"}) + @TypeId("user") @Acl(allow = @Acl.Matcher(service = "test")) public static class ValueEntityWithServiceLevelAcl extends ValueEntity { } - @EntityKey( {"userId", "cartId"}) - @EntityType("user") + @Id( {"userId", "cartId"}) + @TypeId("user") public static class ValueEntityWithMethodLevelAcl extends ValueEntity { @PostMapping("/create") @Acl(allow = @Acl.Matcher(service = "test")) diff --git a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflowentity/StartWorkflow.java b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflow/StartWorkflow.java similarity index 92% rename from sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflowentity/StartWorkflow.java rename to sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflow/StartWorkflow.java index 0f684807b0..c7525d142c 100644 --- a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflowentity/StartWorkflow.java +++ b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflow/StartWorkflow.java @@ -14,6 +14,6 @@ * limitations under the License. */ -package kalix.spring.testmodels.workflowentity; +package kalix.spring.testmodels.workflow; public class StartWorkflow {} diff --git a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflowentity/WorkflowState.java b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflow/WorkflowState.java similarity index 92% rename from sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflowentity/WorkflowState.java rename to sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflow/WorkflowState.java index e764515288..fa781510bb 100644 --- a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflowentity/WorkflowState.java +++ b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflow/WorkflowState.java @@ -14,6 +14,6 @@ * limitations under the License. */ -package kalix.spring.testmodels.workflowentity; +package kalix.spring.testmodels.workflow; public class WorkflowState {} diff --git a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflowentity/WorkflowTestModels.java b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflow/WorkflowTestModels.java similarity index 55% rename from sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflowentity/WorkflowTestModels.java rename to sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflow/WorkflowTestModels.java index 0539264169..f5b7ca25bb 100644 --- a/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflowentity/WorkflowTestModels.java +++ b/sdk/java-sdk-spring/src/test/java/kalix/spring/testmodels/workflow/WorkflowTestModels.java @@ -14,26 +14,22 @@ * limitations under the License. */ -package kalix.spring.testmodels.workflowentity; - -import kalix.javasdk.workflowentity.WorkflowEntity; -import kalix.javasdk.annotations.Acl; -import kalix.javasdk.annotations.EntityKey; -import kalix.javasdk.annotations.EntityType; -import kalix.javasdk.annotations.GenerateEntityKey; -import kalix.javasdk.annotations.JWT; +package kalix.spring.testmodels.workflow; + +import kalix.javasdk.annotations.*; +import kalix.javasdk.workflow.Workflow; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; public class WorkflowTestModels { - @EntityType("transfer-workflow") - @EntityKey("transferId") + @TypeId("transfer-workflow") + @Id("transferId") @RequestMapping("/transfer/{transferId}") - public static class WorkflowEntityWithTypeLevelKey extends WorkflowEntity { + public static class WorkflowWithTypeLevelKey extends Workflow { @Override - public Workflow definition() { + public WorkflowDef definition() { return null; } @@ -43,59 +39,59 @@ public Effect startTransfer(@RequestBody StartWorkflow startWorkflow) { } } - @EntityType("transfer-workflow") + @TypeId("transfer-workflow") @RequestMapping("/transfer/{transferId}") - public static class WorkflowEntityWithMethodLevelKey extends WorkflowEntity { + public static class WorkflowWithMethodLevelKey extends Workflow { @Override - public Workflow definition() { + public WorkflowDef definition() { return null; } @PutMapping - @EntityKey("transferId") + @Id("transferId") public Effect startTransfer(@RequestBody StartWorkflow startWorkflow) { return null; } } - @EntityType("transfer-workflow") - @EntityKey("id") + @TypeId("transfer-workflow") + @Id("id") @RequestMapping("/transfer/{transferId}") - public static class WorkflowEntityWithKeyOverridden extends WorkflowEntity { + public static class WorkflowWithKeyOverridden extends Workflow { @Override - public Workflow definition() { + public WorkflowDef definition() { return null; } @PutMapping - @EntityKey("transferId") + @Id("transferId") public Effect startTransfer(@RequestBody StartWorkflow startWorkflow) { return null; } } - @EntityType("transfer-workflow") - @EntityKey("id") + @TypeId("transfer-workflow") + @Id("id") @RequestMapping("/transfer/{transferId}") - public static class WorkflowEntityWithIllDefinedIdGenerator extends WorkflowEntity { + public static class WorkflowWithIllDefinedIdGenerator extends Workflow { @Override - public Workflow definition() { + public WorkflowDef definition() { return null; } @PutMapping - @GenerateEntityKey - @EntityKey("id") + @GenerateId + @Id("id") public Effect startTransfer(@RequestBody StartWorkflow startWorkflow) { return null; } } - @EntityType("transfer-workflow") + @TypeId("transfer-workflow") @RequestMapping("/transfer/{transferId}") - public static class WorkflowEntityWithoutIdGeneratorAndEntityKey extends WorkflowEntity { + public static class WorkflowWithoutIdGeneratorAndEntityKey extends Workflow { @Override - public Workflow definition() { + public WorkflowDef definition() { return null; } @@ -105,27 +101,27 @@ public Effect startTransfer(@RequestBody StartWorkflow startWorkflow) { } } - @EntityType("transfer-workflow") + @TypeId("transfer-workflow") @RequestMapping("/transfer/{transferId}") - public static class WorkflowEntityWithIdGenerator extends WorkflowEntity { + public static class WorkflowWithIdGenerator extends Workflow { @Override - public Workflow definition() { + public WorkflowDef definition() { return null; } @PutMapping - @GenerateEntityKey + @GenerateId public Effect startTransfer(@RequestBody StartWorkflow startWorkflow) { return null; } } - @EntityType("transfer-workflow") - @EntityKey("transferId") + @TypeId("transfer-workflow") + @Id("transferId") @RequestMapping("/transfer/{transferId}") - public static class WorkflowEntityWithJWT extends WorkflowEntity { + public static class WorkflowWithJWT extends Workflow { @Override - public Workflow definition() { + public WorkflowDef definition() { return null; } @@ -138,24 +134,24 @@ public Effect startTransfer(@RequestBody StartWorkflow startWorkflow) { } } - @EntityType("transfer-workflow") - @EntityKey("transferId") + @TypeId("transfer-workflow") + @Id("transferId") @Acl(allow = @Acl.Matcher(service = "test")) - public static class WorkflowEntityWithAcl extends WorkflowEntity { + public static class WorkflowWithAcl extends Workflow { @Override - public Workflow definition() { + public WorkflowDef definition() { return null; } } - @EntityType("transfer-workflow") - @EntityKey("transferId") + @TypeId("transfer-workflow") + @Id("transferId") @RequestMapping("/transfer/{transferId}") - public static class WorkflowEntityWithMethodLevelAcl extends WorkflowEntity { + public static class WorkflowWithMethodLevelAcl extends Workflow { @Override - public Workflow definition() { + public WorkflowDef definition() { return null; } diff --git a/sdk/java-sdk-spring/src/test/scala/kalix/javasdk/impl/EventSourcedEntityDescriptorFactorySpec.scala b/sdk/java-sdk-spring/src/test/scala/kalix/javasdk/impl/EventSourcedEntityDescriptorFactorySpec.scala index 88188756f4..a3424bed66 100644 --- a/sdk/java-sdk-spring/src/test/scala/kalix/javasdk/impl/EventSourcedEntityDescriptorFactorySpec.scala +++ b/sdk/java-sdk-spring/src/test/scala/kalix/javasdk/impl/EventSourcedEntityDescriptorFactorySpec.scala @@ -69,13 +69,13 @@ class EventSourcedEntityDescriptorFactorySpec extends AnyWordSpec with Component "fail if mix EntityKey and GenerateEntityKey on method" in { intercept[ServiceIntrospectionException] { descriptorFor[IllDefinedEntityWithEntityKeyGeneratorAndEntityKey] - }.getMessage should include("Invalid annotation usage. Found both @EntityKey and @GenerateEntityKey annotations.") + }.getMessage should include("Invalid annotation usage. Found both @Id and @GenerateId annotations.") } "fail if no EntityKey nor GenerateEntityKey is defined" in { intercept[ServiceIntrospectionException] { descriptorFor[IllDefinedEntityWithoutEntityKeyGeneratorNorEntityKey] - }.getMessage should include("Invalid command method. No @EntityKey nor @GenerateEntityKey annotations found.") + }.getMessage should include("Invalid command method. No @Id nor @GenerateId annotations found.") } "generate mappings for a Event Sourced with GenerateEntityKey" in { diff --git a/sdk/java-sdk-spring/src/test/scala/kalix/javasdk/impl/WorkflowEntityDescriptorFactorySpec.scala b/sdk/java-sdk-spring/src/test/scala/kalix/javasdk/impl/WorkflowEntityDescriptorFactorySpec.scala index b9d96d0dce..eff47595b6 100644 --- a/sdk/java-sdk-spring/src/test/scala/kalix/javasdk/impl/WorkflowEntityDescriptorFactorySpec.scala +++ b/sdk/java-sdk-spring/src/test/scala/kalix/javasdk/impl/WorkflowEntityDescriptorFactorySpec.scala @@ -20,23 +20,23 @@ import com.google.protobuf.Descriptors.FieldDescriptor.JavaType import kalix.JwtMethodOptions.JwtMethodMode import kalix.KeyGeneratorMethodOptions.Generator import kalix.javasdk.impl.reflection.ServiceIntrospectionException -import kalix.spring.testmodels.workflowentity.WorkflowTestModels -import kalix.spring.testmodels.workflowentity.WorkflowTestModels.WorkflowEntityWithAcl -import kalix.spring.testmodels.workflowentity.WorkflowTestModels.WorkflowEntityWithIdGenerator -import kalix.spring.testmodels.workflowentity.WorkflowTestModels.WorkflowEntityWithIllDefinedIdGenerator -import kalix.spring.testmodels.workflowentity.WorkflowTestModels.WorkflowEntityWithJWT -import kalix.spring.testmodels.workflowentity.WorkflowTestModels.WorkflowEntityWithKeyOverridden -import kalix.spring.testmodels.workflowentity.WorkflowTestModels.WorkflowEntityWithMethodLevelAcl -import kalix.spring.testmodels.workflowentity.WorkflowTestModels.WorkflowEntityWithMethodLevelKey -import kalix.spring.testmodels.workflowentity.WorkflowTestModels.WorkflowEntityWithTypeLevelKey -import kalix.spring.testmodels.workflowentity.WorkflowTestModels.WorkflowEntityWithoutIdGeneratorAndEntityKey +import kalix.spring.testmodels.workflow.WorkflowTestModels +import kalix.spring.testmodels.workflow.WorkflowTestModels.WorkflowWithAcl +import kalix.spring.testmodels.workflow.WorkflowTestModels.WorkflowWithIdGenerator +import kalix.spring.testmodels.workflow.WorkflowTestModels.WorkflowWithIllDefinedIdGenerator +import kalix.spring.testmodels.workflow.WorkflowTestModels.WorkflowWithJWT +import kalix.spring.testmodels.workflow.WorkflowTestModels.WorkflowWithKeyOverridden +import kalix.spring.testmodels.workflow.WorkflowTestModels.WorkflowWithMethodLevelAcl +import kalix.spring.testmodels.workflow.WorkflowTestModels.WorkflowWithMethodLevelKey +import kalix.spring.testmodels.workflow.WorkflowTestModels.WorkflowWithTypeLevelKey +import kalix.spring.testmodels.workflow.WorkflowTestModels.WorkflowWithoutIdGeneratorAndEntityKey import org.scalatest.wordspec.AnyWordSpec class WorkflowEntityDescriptorFactorySpec extends AnyWordSpec with ComponentDescriptorSuite { "Workflow descriptor factory" should { "generate mappings for a Workflow with entity keys in path" in { - assertDescriptor[WorkflowEntityWithTypeLevelKey] { desc => + assertDescriptor[WorkflowWithTypeLevelKey] { desc => val method = desc.commandHandlers("StartTransfer") val fieldKey = "transferId" assertRequestFieldJavaType(method, fieldKey, JavaType.STRING) @@ -46,7 +46,7 @@ class WorkflowEntityDescriptorFactorySpec extends AnyWordSpec with ComponentDesc } "generate mappings for a Workflow with keys in path and EntityKey on method" in { - assertDescriptor[WorkflowEntityWithMethodLevelKey] { desc => + assertDescriptor[WorkflowWithMethodLevelKey] { desc => val method = desc.commandHandlers("StartTransfer") val fieldKey = "transferId" assertRequestFieldJavaType(method, fieldKey, JavaType.STRING) @@ -56,7 +56,7 @@ class WorkflowEntityDescriptorFactorySpec extends AnyWordSpec with ComponentDesc } "generate mappings for a Workflow with EntityKey on method overrides EntityKey on type" in { - assertDescriptor[WorkflowEntityWithKeyOverridden] { desc => + assertDescriptor[WorkflowWithKeyOverridden] { desc => val method = desc.commandHandlers("StartTransfer") val fieldKey = "transferId" assertRequestFieldJavaType(method, fieldKey, JavaType.STRING) @@ -67,18 +67,18 @@ class WorkflowEntityDescriptorFactorySpec extends AnyWordSpec with ComponentDesc "fail if mix EntityKey and GenerateEntityKey on method" in { intercept[ServiceIntrospectionException] { - descriptorFor[WorkflowEntityWithIllDefinedIdGenerator] - }.getMessage should include("Invalid annotation usage. Found both @EntityKey and @GenerateEntityKey annotations.") + descriptorFor[WorkflowWithIllDefinedIdGenerator] + }.getMessage should include("Invalid annotation usage. Found both @Id and @GenerateId annotations.") } "fail if no EntityKey nor GenerateEntityKey is defined" in { intercept[ServiceIntrospectionException] { - descriptorFor[WorkflowEntityWithoutIdGeneratorAndEntityKey] - }.getMessage should include("Invalid command method. No @EntityKey nor @GenerateEntityKey annotations found.") + descriptorFor[WorkflowWithoutIdGeneratorAndEntityKey] + }.getMessage should include("Invalid command method. No @Id nor @GenerateId annotations found.") } - "generate mappings for a Workflow with GenerateEntityKey" in { - assertDescriptor[WorkflowEntityWithIdGenerator] { desc => + "generate mappings for a Workflow with GenerateId" in { + assertDescriptor[WorkflowWithIdGenerator] { desc => val method = desc.commandHandlers("StartTransfer") assertRequestFieldJavaType(method, "json_body", JavaType.MESSAGE) @@ -88,7 +88,7 @@ class WorkflowEntityDescriptorFactorySpec extends AnyWordSpec with ComponentDesc } "generate mappings for a Workflow with workflow keys in path and JWT annotations" in { - assertDescriptor[WorkflowEntityWithJWT] { desc => + assertDescriptor[WorkflowWithJWT] { desc => val method = desc.commandHandlers("StartTransfer") val fieldKey = "transferId" assertRequestFieldJavaType(method, fieldKey, JavaType.STRING) @@ -103,7 +103,7 @@ class WorkflowEntityDescriptorFactorySpec extends AnyWordSpec with ComponentDesc } "generate ACL annotations at service level" in { - assertDescriptor[WorkflowEntityWithAcl] { desc => + assertDescriptor[WorkflowWithAcl] { desc => val extension = desc.serviceDescriptor.getOptions.getExtension(kalix.Annotations.service) val service = extension.getAcl.getAllow(0).getService service shouldBe "test" @@ -111,7 +111,7 @@ class WorkflowEntityDescriptorFactorySpec extends AnyWordSpec with ComponentDesc } "generate ACL annotations at method level" in { - assertDescriptor[WorkflowEntityWithMethodLevelAcl] { desc => + assertDescriptor[WorkflowWithMethodLevelAcl] { desc => val extension = findKalixMethodOptions(desc, "StartTransfer") val service = extension.getAcl.getAllow(0).getService service shouldBe "test"