diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5b3e6b9a..985a27db 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ jobs: - name: Set up JDK ${{ matrix.java }} uses: actions/setup-java@v3 with: - java-version: 11 + java-version: 17 distribution: 'adopt' - name: Setup Gradle diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 493a6a59..180e5ce9 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -15,7 +15,7 @@ jobs: strategy: fail-fast: false matrix: - java: [ 11, 17, 21 ] + java: [ 17, 21 ] steps: - uses: actions/checkout@v4 - name: Set up JDK ${{ matrix.java }} diff --git a/README.md b/README.md index 2d146fd7..1d377281 100644 --- a/README.md +++ b/README.md @@ -314,7 +314,7 @@ We know that your time is precious and, therefore, deeply value any effort to co Prerequisites: -- JDK >= 11 +- JDK >= 17 - Docker or Podman To build the SDK: diff --git a/admin-client/build.gradle.kts b/admin-client/build.gradle.kts index 02976348..687f47bd 100644 --- a/admin-client/build.gradle.kts +++ b/admin-client/build.gradle.kts @@ -1,4 +1,3 @@ -import net.ltgt.gradle.errorprone.errorprone import org.openapitools.generator.gradle.plugin.tasks.GenerateTask plugins { @@ -48,11 +47,6 @@ tasks.withType { finalizedBy("spotlessJava") } -tasks.withType().configureEach { - // Disable errorprone for this module - options.errorprone.disableAllChecks.set(true) -} - configure { java { targetExclude(fileTree("build/generate-resources") { include("**/*.java") }) } } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 21617019..bd2c3b58 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -9,8 +9,7 @@ repositories { dependencies { - implementation("net.ltgt.gradle:gradle-errorprone-plugin:4.0.0") - implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.0") - implementation("org.jetbrains.kotlin:kotlin-serialization:2.0.0") + implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:2.0.21") + implementation("org.jetbrains.kotlin:kotlin-serialization:2.0.21") implementation("com.diffplug.spotless:spotless-plugin-gradle:6.25.0") } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/java-conventions.gradle.kts b/buildSrc/src/main/kotlin/java-conventions.gradle.kts index e34fda5f..e99c8195 100644 --- a/buildSrc/src/main/kotlin/java-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/java-conventions.gradle.kts @@ -1,35 +1,16 @@ - -import net.ltgt.gradle.errorprone.errorprone - plugins { java - id("net.ltgt.errorprone") id("com.diffplug.spotless") } -dependencies { errorprone("com.google.errorprone:error_prone_core:2.28.0") } - // Configure the java toolchain to use. If not found, it will be downloaded automatically java { - toolchain { languageVersion = JavaLanguageVersion.of(11) } + toolchain { languageVersion = JavaLanguageVersion.of(17) } withJavadocJar() withSourcesJar() } -tasks.withType().configureEach { - options.errorprone.disableWarningsInGeneratedCode.set(true) - options.errorprone.disable( - // We use toString() in proto messages for debugging reasons. - "LiteProtoToString", - // This check is proposing to use a guava API instead... - "StringSplitter", - // This is conflicting with a javadoc warn lint - "MissingSummary" - ) - options.errorprone.excludedPaths.set(".*/build/generated/.*") -} - tasks.withType { useJUnitPlatform() } configure { diff --git a/buildSrc/src/main/kotlin/kotlin-conventions.gradle.kts b/buildSrc/src/main/kotlin/kotlin-conventions.gradle.kts index ae260594..3c76ea60 100644 --- a/buildSrc/src/main/kotlin/kotlin-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/kotlin-conventions.gradle.kts @@ -5,7 +5,7 @@ plugins { } java { - toolchain { languageVersion = JavaLanguageVersion.of(11) } + toolchain { languageVersion = JavaLanguageVersion.of(17) } withJavadocJar() withSourcesJar() diff --git a/examples/src/main/java/my/restate/sdk/examples/Counter.java b/examples/src/main/java/my/restate/sdk/examples/Counter.java index 5c687751..a612777c 100644 --- a/examples/src/main/java/my/restate/sdk/examples/Counter.java +++ b/examples/src/main/java/my/restate/sdk/examples/Counter.java @@ -48,13 +48,6 @@ public long get(SharedObjectContext ctx) { return ctx.get(TOTAL).orElse(0L); } - /** Get the current counter value. */ - @Shared - @Handler - public Node getNode(SharedObjectContext ctx) { - return null; - } - /** Add a value, and get both the previous value and the new value. */ @Handler public CounterUpdateResult getAndAdd(ObjectContext ctx, long request) { @@ -71,39 +64,5 @@ public static void main(String[] args) { RestateHttpEndpointBuilder.builder().bind(new Counter()).buildAndListen(); } - public static class Node { - private final String data; - private final Node inner; - - public Node(String data, Node inner) { - this.data = data; - this.inner = inner; - } - - public String getData() { - return data; - } - - public Node getInner() { - return inner; - } - } - - public static class CounterUpdateResult { - private final long newValue; - private final long oldValue; - - public CounterUpdateResult(long newValue, long oldValue) { - this.newValue = newValue; - this.oldValue = oldValue; - } - - public long getNewValue() { - return newValue; - } - - public long getOldValue() { - return oldValue; - } - } + public record CounterUpdateResult(long newValue, long oldValue) {} } diff --git a/examples/src/main/java/my/restate/sdk/examples/LoanWorkflow.java b/examples/src/main/java/my/restate/sdk/examples/LoanWorkflow.java index d04fd73b..c5cdab7b 100644 --- a/examples/src/main/java/my/restate/sdk/examples/LoanWorkflow.java +++ b/examples/src/main/java/my/restate/sdk/examples/LoanWorkflow.java @@ -8,8 +8,6 @@ // https://github.com/restatedev/sdk-java/blob/main/LICENSE package my.restate.sdk.examples; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; import dev.restate.sdk.Context; import dev.restate.sdk.JsonSerdes; import dev.restate.sdk.SharedWorkflowContext; @@ -45,41 +43,8 @@ public enum Status { TRANSFER_FAILED } - public static class LoanRequest { - - private final String customerName; - private final String customerId; - private final String customerBankAccount; - private final BigDecimal amount; - - @JsonCreator - public LoanRequest( - @JsonProperty("customerName") String customerName, - @JsonProperty("customerId") String customerId, - @JsonProperty("customerBankAccount") String customerBankAccount, - @JsonProperty("amount") BigDecimal amount) { - this.customerName = customerName; - this.customerId = customerId; - this.customerBankAccount = customerBankAccount; - this.amount = amount; - } - - public String getCustomerName() { - return customerName; - } - - public String getCustomerId() { - return customerId; - } - - public String getCustomerBankAccount() { - return customerBankAccount; - } - - public BigDecimal getAmount() { - return amount; - } - } + public record LoanRequest( + String customerName, String customerId, String customerBankAccount, BigDecimal amount) {} private static final Logger LOG = LogManager.getLogger(LoanWorkflow.class); @@ -123,8 +88,7 @@ public String run(WorkflowContext ctx, LoanRequest loanRequest) { executionTime = bankClient .transfer( - new TransferRequest( - loanRequest.getCustomerBankAccount(), loanRequest.getAmount())) + new TransferRequest(loanRequest.customerBankAccount(), loanRequest.amount())) .await(Duration.ofDays(7)); } catch (TerminalException | TimeoutException e) { LOG.warn("Transaction failed", e); @@ -223,24 +187,5 @@ public Instant transfer(Context context, TransferRequest request) throws Termina } } - public static class TransferRequest { - private final String bankAccount; - private final BigDecimal amount; - - @JsonCreator - public TransferRequest( - @JsonProperty("bankAccount") String bankAccount, - @JsonProperty("amount") BigDecimal amount) { - this.bankAccount = bankAccount; - this.amount = amount; - } - - public String getBankAccount() { - return bankAccount; - } - - public BigDecimal getAmount() { - return amount; - } - } + public record TransferRequest(String bankAccount, BigDecimal amount) {} } diff --git a/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/Handler.java b/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/Handler.java index 70c0f41d..d5128d5c 100644 --- a/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/Handler.java +++ b/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/Handler.java @@ -11,54 +11,13 @@ import java.util.Objects; import org.jspecify.annotations.Nullable; -public class Handler { - - private final CharSequence name; - private final HandlerType handlerType; - private final @Nullable String inputAccept; - private final PayloadType inputType; - private final PayloadType outputType; - private final @Nullable String documentation; - - public Handler( - CharSequence name, - HandlerType handlerType, - @Nullable String inputAccept, - PayloadType inputType, - PayloadType outputType, - @Nullable String documentation) { - this.name = name; - this.handlerType = handlerType; - this.inputAccept = inputAccept; - this.inputType = inputType; - this.outputType = outputType; - this.documentation = documentation; - } - - public CharSequence getName() { - return name; - } - - public HandlerType getHandlerType() { - return handlerType; - } - - @Nullable - public String getInputAccept() { - return inputAccept; - } - - public PayloadType getInputType() { - return inputType; - } - - public PayloadType getOutputType() { - return outputType; - } - - public @Nullable String getDocumentation() { - return documentation; - } +public record Handler( + CharSequence name, + HandlerType handlerType, + @Nullable String inputAccept, + PayloadType inputType, + PayloadType outputType, + @Nullable String documentation) { public static Builder builder() { return new Builder(); diff --git a/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/HandlerType.java b/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/HandlerType.java index af8c4288..8c035bc9 100644 --- a/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/HandlerType.java +++ b/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/HandlerType.java @@ -12,5 +12,5 @@ public enum HandlerType { SHARED, EXCLUSIVE, STATELESS, - WORKFLOW; + WORKFLOW } diff --git a/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/PayloadType.java b/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/PayloadType.java index 8a60643d..5041f045 100644 --- a/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/PayloadType.java +++ b/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/PayloadType.java @@ -8,66 +8,4 @@ // https://github.com/restatedev/sdk-java/blob/main/LICENSE package dev.restate.sdk.gen.model; -import java.util.Objects; - -public class PayloadType { - - private final boolean isEmpty; - private final String name; - private final String boxed; - private final String serdeDecl; - - public PayloadType(boolean isEmpty, String name, String boxed, String serdeDecl) { - this.isEmpty = isEmpty; - this.name = name; - this.boxed = boxed; - this.serdeDecl = serdeDecl; - } - - public boolean isEmpty() { - return isEmpty; - } - - public String getName() { - return name; - } - - public String getBoxed() { - return boxed; - } - - public String getSerdeDecl() { - return serdeDecl; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof PayloadType)) return false; - PayloadType that = (PayloadType) o; - return isEmpty == that.isEmpty - && Objects.equals(name, that.name) - && Objects.equals(boxed, that.boxed) - && Objects.equals(serdeDecl, that.serdeDecl); - } - - @Override - public int hashCode() { - return Objects.hash(name, boxed, serdeDecl); - } - - @Override - public String toString() { - return "PayloadType{" - + "name='" - + name - + '\'' - + ", boxed='" - + boxed - + '\'' - + ", serdeDecl='" - + serdeDecl - + '\'' - + '}'; - } -} +public record PayloadType(boolean isEmpty, String name, String boxed, String serdeDecl) {} diff --git a/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/Service.java b/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/Service.java index dc6de910..c839c399 100644 --- a/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/Service.java +++ b/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/model/Service.java @@ -58,7 +58,7 @@ public String getSimpleServiceName() { } public CharSequence getGeneratedClassFqcnPrefix() { - if (this.targetPkg == null || this.targetPkg.length() == 0) { + if (this.targetPkg == null || this.targetPkg.isEmpty()) { return getSimpleServiceName(); } return this.targetPkg + "." + getSimpleServiceName(); @@ -152,7 +152,7 @@ public Service validateAndBuild() { } if (serviceType.equals(ServiceType.WORKFLOW)) { - if (handlers.stream().filter(m -> m.getHandlerType().equals(HandlerType.WORKFLOW)).count() + if (handlers.stream().filter(m -> m.handlerType().equals(HandlerType.WORKFLOW)).count() != 1) { throw new IllegalArgumentException( "Workflow services must have exactly one method annotated as @Workflow"); @@ -160,7 +160,7 @@ public Service validateAndBuild() { } if (handlers.size() - != handlers.stream().map(Handler::getName).collect(Collectors.toSet()).size()) { + != handlers.stream().map(Handler::name).collect(Collectors.toSet()).size()) { throw new IllegalArgumentException("Cannot have two handlers with the same name"); } diff --git a/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/template/HandlebarsTemplateEngine.java b/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/template/HandlebarsTemplateEngine.java index 23bbf1f2..73b0ed37 100644 --- a/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/template/HandlebarsTemplateEngine.java +++ b/sdk-api-gen-common/src/main/java/dev/restate/sdk/gen/template/HandlebarsTemplateEngine.java @@ -46,20 +46,19 @@ public HandlebarsTemplateEngine( handlebars.registerHelper( "targetExpr", (h, options) -> { - switch (h.serviceType) { - case SERVICE: - return String.format( - "Target.service(%s.SERVICE_NAME, \"%s\")", h.definitionsClass, h.name); - case VIRTUAL_OBJECT: - return String.format( - "Target.virtualObject(%s.SERVICE_NAME, %s, \"%s\")", - h.definitionsClass, options.param(0), h.name); - case WORKFLOW: - return String.format( - "Target.workflow(%s.SERVICE_NAME, %s, \"%s\")", - h.definitionsClass, options.param(0), h.name); - } - throw new IllegalStateException(); + return switch (h.serviceType) { + case SERVICE -> + String.format( + "Target.service(%s.SERVICE_NAME, \"%s\")", h.definitionsClass, h.name); + case VIRTUAL_OBJECT -> + String.format( + "Target.virtualObject(%s.SERVICE_NAME, %s, \"%s\")", + h.definitionsClass, options.param(0), h.name); + case WORKFLOW -> + String.format( + "Target.workflow(%s.SERVICE_NAME, %s, \"%s\")", + h.definitionsClass, options.param(0), h.name); + }; }); handlebars.registerHelpers(StringEscapeUtils.class); @@ -177,30 +176,30 @@ private HandlerTemplateModel( ServiceType serviceType, String definitionsClass, Set handlerNamesToPrefix) { - this.name = inner.getName().toString(); + this.name = inner.name().toString(); this.methodName = (handlerNamesToPrefix.contains(this.name) ? "_" : "") + this.name; - this.handlerType = inner.getHandlerType().toString(); - this.isWorkflow = inner.getHandlerType() == HandlerType.WORKFLOW; - this.isShared = inner.getHandlerType() == HandlerType.SHARED; - this.isExclusive = inner.getHandlerType() == HandlerType.EXCLUSIVE; - this.isStateless = inner.getHandlerType() == HandlerType.STATELESS; + this.handlerType = inner.handlerType().toString(); + this.isWorkflow = inner.handlerType() == HandlerType.WORKFLOW; + this.isShared = inner.handlerType() == HandlerType.SHARED; + this.isExclusive = inner.handlerType() == HandlerType.EXCLUSIVE; + this.isStateless = inner.handlerType() == HandlerType.STATELESS; this.serviceType = serviceType; this.definitionsClass = definitionsClass; - this.documentation = inner.getDocumentation(); + this.documentation = inner.documentation(); - this.inputEmpty = inner.getInputType().isEmpty(); - this.inputFqcn = inner.getInputType().getName(); - this.inputSerdeDecl = inner.getInputType().getSerdeDecl(); - this.boxedInputFqcn = inner.getInputType().getBoxed(); + this.inputEmpty = inner.inputType().isEmpty(); + this.inputFqcn = inner.inputType().name(); + this.inputSerdeDecl = inner.inputType().serdeDecl(); + this.boxedInputFqcn = inner.inputType().boxed(); this.inputSerdeFieldName = this.name.toUpperCase() + "_INPUT"; - this.inputAcceptContentType = inner.getInputAccept(); + this.inputAcceptContentType = inner.inputAccept(); this.inputSerdeRef = definitionsClass + ".Serde." + this.inputSerdeFieldName; - this.outputEmpty = inner.getOutputType().isEmpty(); - this.outputFqcn = inner.getOutputType().getName(); - this.outputSerdeDecl = inner.getOutputType().getSerdeDecl(); - this.boxedOutputFqcn = inner.getOutputType().getBoxed(); + this.outputEmpty = inner.outputType().isEmpty(); + this.outputFqcn = inner.outputType().name(); + this.outputSerdeDecl = inner.outputType().serdeDecl(); + this.boxedOutputFqcn = inner.outputType().boxed(); this.outputSerdeFieldName = this.name.toUpperCase() + "_OUTPUT"; this.outputSerdeRef = definitionsClass + ".Serde." + this.outputSerdeFieldName; } diff --git a/sdk-api-gen/src/main/java/dev/restate/sdk/gen/ElementConverter.java b/sdk-api-gen/src/main/java/dev/restate/sdk/gen/ElementConverter.java index b7e9cf85..3c8518c1 100644 --- a/sdk-api-gen/src/main/java/dev/restate/sdk/gen/ElementConverter.java +++ b/sdk-api-gen/src/main/java/dev/restate/sdk/gen/ElementConverter.java @@ -194,15 +194,11 @@ private Handler fromExecutableElement(ServiceType serviceType, ExecutableElement } private HandlerType defaultHandlerType(ServiceType serviceType) { - switch (serviceType) { - case SERVICE: - return HandlerType.STATELESS; - case VIRTUAL_OBJECT: - return HandlerType.EXCLUSIVE; - case WORKFLOW: - return HandlerType.SHARED; - } - throw new IllegalStateException("Unexpected"); + return switch (serviceType) { + case SERVICE -> HandlerType.STATELESS; + case VIRTUAL_OBJECT -> HandlerType.EXCLUSIVE; + case WORKFLOW -> HandlerType.SHARED; + }; } private void validateMethodSignature( @@ -341,56 +337,37 @@ private static String contentTypeDecoratedSerdeDecl(String serdeDecl, String con } private static String jsonSerdeDecl(TypeMirror ty) { - switch (ty.getKind()) { - case BOOLEAN: - return "dev.restate.sdk.JsonSerdes.BOOLEAN"; - case BYTE: - return "dev.restate.sdk.JsonSerdes.BYTE"; - case SHORT: - return "dev.restate.sdk.JsonSerdes.SHORT"; - case INT: - return "dev.restate.sdk.JsonSerdes.INT"; - case LONG: - return "dev.restate.sdk.JsonSerdes.LONG"; - case CHAR: - return "dev.restate.sdk.JsonSerdes.CHAR"; - case FLOAT: - return "dev.restate.sdk.JsonSerdes.FLOAT"; - case DOUBLE: - return "dev.restate.sdk.JsonSerdes.DOUBLE"; - case VOID: - return "dev.restate.sdk.common.Serde.VOID"; - default: - // Default to Jackson type reference serde - return "dev.restate.sdk.serde.jackson.JacksonSerdes.of(new com.fasterxml.jackson.core.type.TypeReference<" - + ty - + ">() {})"; - } + return switch (ty.getKind()) { + case BOOLEAN -> "dev.restate.sdk.JsonSerdes.BOOLEAN"; + case BYTE -> "dev.restate.sdk.JsonSerdes.BYTE"; + case SHORT -> "dev.restate.sdk.JsonSerdes.SHORT"; + case INT -> "dev.restate.sdk.JsonSerdes.INT"; + case LONG -> "dev.restate.sdk.JsonSerdes.LONG"; + case CHAR -> "dev.restate.sdk.JsonSerdes.CHAR"; + case FLOAT -> "dev.restate.sdk.JsonSerdes.FLOAT"; + case DOUBLE -> "dev.restate.sdk.JsonSerdes.DOUBLE"; + case VOID -> "dev.restate.sdk.common.Serde.VOID"; + default -> + // Default to Jackson type reference serde + "dev.restate.sdk.serde.jackson.JacksonSerdes.of(new com.fasterxml.jackson.core.type.TypeReference<" + + ty + + ">() {})"; + }; } private static String boxedType(TypeMirror ty) { - switch (ty.getKind()) { - case BOOLEAN: - return "Boolean"; - case BYTE: - return "Byte"; - case SHORT: - return "Short"; - case INT: - return "Integer"; - case LONG: - return "Long"; - case CHAR: - return "Char"; - case FLOAT: - return "Float"; - case DOUBLE: - return "Double"; - case VOID: - return "Void"; - default: - return ty.toString(); - } + return switch (ty.getKind()) { + case BOOLEAN -> "Boolean"; + case BYTE -> "Byte"; + case SHORT -> "Short"; + case INT -> "Integer"; + case LONG -> "Long"; + case CHAR -> "Char"; + case FLOAT -> "Float"; + case DOUBLE -> "Double"; + case VOID -> "Void"; + default -> ty.toString(); + }; } private static String sanitizeJavadoc(String documentation) { diff --git a/sdk-api/src/main/java/dev/restate/sdk/JsonSerdes.java b/sdk-api/src/main/java/dev/restate/sdk/JsonSerdes.java index 97308bc4..cb018d41 100644 --- a/sdk-api/src/main/java/dev/restate/sdk/JsonSerdes.java +++ b/sdk-api/src/main/java/dev/restate/sdk/JsonSerdes.java @@ -32,7 +32,7 @@ public abstract class JsonSerdes { private JsonSerdes() {} /** {@link Serde} for {@link String}. This writes and reads {@link String} as JSON value. */ - public static Serde<@NonNull String> STRING = + public static final Serde<@NonNull String> STRING = usingJackson( "string", JsonGenerator::writeString, @@ -45,7 +45,7 @@ private JsonSerdes() {} }); /** {@link Serde} for {@link Boolean}. This writes and reads {@link Boolean} as JSON value. */ - public static Serde<@NonNull Boolean> BOOLEAN = + public static final Serde<@NonNull Boolean> BOOLEAN = usingJackson( "boolean", JsonGenerator::writeBoolean, @@ -55,7 +55,7 @@ private JsonSerdes() {} }); /** {@link Serde} for {@link Byte}. This writes and reads {@link Byte} as JSON value. */ - public static Serde<@NonNull Byte> BYTE = + public static final Serde<@NonNull Byte> BYTE = usingJackson( "number", JsonGenerator::writeNumber, @@ -65,7 +65,7 @@ private JsonSerdes() {} }); /** {@link Serde} for {@link Short}. This writes and reads {@link Short} as JSON value. */ - public static Serde<@NonNull Short> SHORT = + public static final Serde<@NonNull Short> SHORT = usingJackson( "number", JsonGenerator::writeNumber, @@ -75,7 +75,7 @@ private JsonSerdes() {} }); /** {@link Serde} for {@link Integer}. This writes and reads {@link Integer} as JSON value. */ - public static Serde<@NonNull Integer> INT = + public static final Serde<@NonNull Integer> INT = usingJackson( "number", JsonGenerator::writeNumber, @@ -85,7 +85,7 @@ private JsonSerdes() {} }); /** {@link Serde} for {@link Long}. This writes and reads {@link Long} as JSON value. */ - public static Serde<@NonNull Long> LONG = + public static final Serde<@NonNull Long> LONG = usingJackson( "number", JsonGenerator::writeNumber, @@ -95,7 +95,7 @@ private JsonSerdes() {} }); /** {@link Serde} for {@link Float}. This writes and reads {@link Float} as JSON value. */ - public static Serde<@NonNull Float> FLOAT = + public static final Serde<@NonNull Float> FLOAT = usingJackson( "number", JsonGenerator::writeNumber, @@ -105,7 +105,7 @@ private JsonSerdes() {} }); /** {@link Serde} for {@link Double}. This writes and reads {@link Double} as JSON value. */ - public static Serde<@NonNull Double> DOUBLE = + public static final Serde<@NonNull Double> DOUBLE = usingJackson( "number", JsonGenerator::writeNumber, diff --git a/sdk-common/src/main/java/dev/restate/sdk/client/RequestOptions.java b/sdk-common/src/main/java/dev/restate/sdk/client/RequestOptions.java index 40ec727b..c979fd95 100644 --- a/sdk-common/src/main/java/dev/restate/sdk/client/RequestOptions.java +++ b/sdk-common/src/main/java/dev/restate/sdk/client/RequestOptions.java @@ -48,8 +48,7 @@ public RequestOptions copy() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof RequestOptions)) return false; - RequestOptions that = (RequestOptions) o; + if (!(o instanceof RequestOptions that)) return false; return Objects.equals(additionalHeaders, that.additionalHeaders); } diff --git a/sdk-common/src/main/java/dev/restate/sdk/common/Output.java b/sdk-common/src/main/java/dev/restate/sdk/common/Output.java index df5c3c2a..d862c48f 100644 --- a/sdk-common/src/main/java/dev/restate/sdk/common/Output.java +++ b/sdk-common/src/main/java/dev/restate/sdk/common/Output.java @@ -82,8 +82,7 @@ public static Output ready(T value) { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof Output)) return false; - Output output = (Output) o; + if (!(o instanceof Output output)) return false; return isReady == output.isReady && Objects.equals(value, output.value); } diff --git a/sdk-common/src/main/java/dev/restate/sdk/common/RetryPolicy.java b/sdk-common/src/main/java/dev/restate/sdk/common/RetryPolicy.java index 11bd0da6..554ca53a 100644 --- a/sdk-common/src/main/java/dev/restate/sdk/common/RetryPolicy.java +++ b/sdk-common/src/main/java/dev/restate/sdk/common/RetryPolicy.java @@ -116,8 +116,7 @@ public float getExponentiationFactor() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof RetryPolicy)) return false; - RetryPolicy that = (RetryPolicy) o; + if (!(o instanceof RetryPolicy that)) return false; return Float.compare(exponentiationFactor, that.exponentiationFactor) == 0 && Objects.equals(initialDelay, that.initialDelay) && Objects.equals(maxDelay, that.maxDelay) diff --git a/sdk-common/src/main/java/dev/restate/sdk/common/RichSerde.java b/sdk-common/src/main/java/dev/restate/sdk/common/RichSerde.java index 9256c831..20e5418f 100644 --- a/sdk-common/src/main/java/dev/restate/sdk/common/RichSerde.java +++ b/sdk-common/src/main/java/dev/restate/sdk/common/RichSerde.java @@ -24,7 +24,7 @@ public interface RichSerde extends Serde { Object jsonSchema(); static RichSerde withSchema(Object jsonSchema, Serde inner) { - return new RichSerde() { + return new RichSerde<>() { @Override public byte[] serialize(T value) { return inner.serialize(value); diff --git a/sdk-common/src/main/java/dev/restate/sdk/common/syscalls/HandlerSpecification.java b/sdk-common/src/main/java/dev/restate/sdk/common/syscalls/HandlerSpecification.java index cee10c9d..658b64a3 100644 --- a/sdk-common/src/main/java/dev/restate/sdk/common/syscalls/HandlerSpecification.java +++ b/sdk-common/src/main/java/dev/restate/sdk/common/syscalls/HandlerSpecification.java @@ -94,8 +94,7 @@ public HandlerSpecification withMetadata(Map metadata) @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof HandlerSpecification)) return false; - HandlerSpecification that = (HandlerSpecification) o; + if (!(o instanceof HandlerSpecification that)) return false; return Objects.equals(name, that.name) && handlerType == that.handlerType && Objects.equals(acceptContentType, that.acceptContentType) diff --git a/sdk-common/src/main/java/dev/restate/sdk/common/syscalls/Result.java b/sdk-common/src/main/java/dev/restate/sdk/common/syscalls/Result.java index 7f6a774e..a68a519d 100644 --- a/sdk-common/src/main/java/dev/restate/sdk/common/syscalls/Result.java +++ b/sdk-common/src/main/java/dev/restate/sdk/common/syscalls/Result.java @@ -86,7 +86,7 @@ public static Result failure(TerminalException t) { static class Empty extends Result { - public static Empty INSTANCE = new Empty<>(); + public static final Empty INSTANCE = new Empty<>(); private Empty() {} diff --git a/sdk-core/src/main/java/dev/restate/sdk/core/EndpointManifest.java b/sdk-core/src/main/java/dev/restate/sdk/core/EndpointManifest.java index acc9935b..03f58f29 100644 --- a/sdk-core/src/main/java/dev/restate/sdk/core/EndpointManifest.java +++ b/sdk-core/src/main/java/dev/restate/sdk/core/EndpointManifest.java @@ -70,15 +70,11 @@ public EndpointManifestSchema manifest() { } private static Service.Ty convertServiceType(ServiceType serviceType) { - switch (serviceType) { - case WORKFLOW: - return Service.Ty.WORKFLOW; - case SERVICE: - return Service.Ty.SERVICE; - case VIRTUAL_OBJECT: - return Service.Ty.VIRTUAL_OBJECT; - } - throw new IllegalStateException(); + return switch (serviceType) { + case WORKFLOW -> Service.Ty.WORKFLOW; + case SERVICE -> Service.Ty.SERVICE; + case VIRTUAL_OBJECT -> Service.Ty.VIRTUAL_OBJECT; + }; } private static Handler convertHandler(HandlerDefinition handler) { @@ -135,14 +131,10 @@ private static Output convertHandlerOutput(HandlerSpecification spec) { } private static Handler.Ty convertHandlerType(HandlerType handlerType) { - switch (handlerType) { - case WORKFLOW: - return Handler.Ty.WORKFLOW; - case EXCLUSIVE: - return Handler.Ty.EXCLUSIVE; - case SHARED: - return Handler.Ty.SHARED; - } - throw new IllegalStateException(); + return switch (handlerType) { + case WORKFLOW -> Handler.Ty.WORKFLOW; + case EXCLUSIVE -> Handler.Ty.EXCLUSIVE; + case SHARED -> Handler.Ty.SHARED; + }; } } diff --git a/sdk-core/src/main/java/dev/restate/sdk/core/Entries.java b/sdk-core/src/main/java/dev/restate/sdk/core/Entries.java index 010b24ce..69d2cade 100644 --- a/sdk-core/src/main/java/dev/restate/sdk/core/Entries.java +++ b/sdk-core/src/main/java/dev/restate/sdk/core/Entries.java @@ -421,10 +421,9 @@ String getName(CallEntryMessage expected) { @Override void checkEntryHeader(CallEntryMessage expected, MessageLite actual) throws ProtocolException { - if (!(actual instanceof CallEntryMessage)) { + if (!(actual instanceof CallEntryMessage actualInvoke)) { throw ProtocolException.entryDoesNotMatch(expected, actual); } - CallEntryMessage actualInvoke = (CallEntryMessage) actual; if (!(Objects.equals(expected.getServiceName(), actualInvoke.getServiceName()) && Objects.equals(expected.getHandlerName(), actualInvoke.getHandlerName()) @@ -479,10 +478,9 @@ String getName(OneWayCallEntryMessage expected) { @Override void checkEntryHeader(OneWayCallEntryMessage expected, MessageLite actual) throws ProtocolException { - if (!(actual instanceof OneWayCallEntryMessage)) { + if (!(actual instanceof OneWayCallEntryMessage actualInvoke)) { throw ProtocolException.entryDoesNotMatch(expected, actual); } - OneWayCallEntryMessage actualInvoke = (OneWayCallEntryMessage) actual; if (!(Objects.equals(expected.getServiceName(), actualInvoke.getServiceName()) && Objects.equals(expected.getHandlerName(), actualInvoke.getHandlerName()) diff --git a/sdk-core/src/main/java/dev/restate/sdk/core/ExceptionCatchingSubscriber.java b/sdk-core/src/main/java/dev/restate/sdk/core/ExceptionCatchingSubscriber.java index d5386f3c..e59f533b 100644 --- a/sdk-core/src/main/java/dev/restate/sdk/core/ExceptionCatchingSubscriber.java +++ b/sdk-core/src/main/java/dev/restate/sdk/core/ExceptionCatchingSubscriber.java @@ -12,7 +12,7 @@ class ExceptionCatchingSubscriber implements Flow.Subscriber { - Flow.Subscriber invocationInputSubscriber; + final Flow.Subscriber invocationInputSubscriber; public ExceptionCatchingSubscriber(Flow.Subscriber invocationInputSubscriber) { this.invocationInputSubscriber = invocationInputSubscriber; diff --git a/sdk-core/src/main/java/dev/restate/sdk/core/InvocationState.java b/sdk-core/src/main/java/dev/restate/sdk/core/InvocationState.java index 387d30fd..2944d6c3 100644 --- a/sdk-core/src/main/java/dev/restate/sdk/core/InvocationState.java +++ b/sdk-core/src/main/java/dev/restate/sdk/core/InvocationState.java @@ -12,5 +12,5 @@ public enum InvocationState { WAITING_START, REPLAYING, PROCESSING, - CLOSED; + CLOSED } diff --git a/sdk-core/src/main/java/dev/restate/sdk/core/InvocationStateMachine.java b/sdk-core/src/main/java/dev/restate/sdk/core/InvocationStateMachine.java index d88679e7..faf77006 100644 --- a/sdk-core/src/main/java/dev/restate/sdk/core/InvocationStateMachine.java +++ b/sdk-core/src/main/java/dev/restate/sdk/core/InvocationStateMachine.java @@ -179,13 +179,12 @@ void startAndConsumeInput(SyscallCallback afterStartCallback) { } void onStartMessage(MessageLite msg) { - if (!(msg instanceof Protocol.StartMessage)) { + if (!(msg instanceof Protocol.StartMessage startMessage)) { this.fail(ProtocolException.unexpectedMessage(Protocol.StartMessage.class, msg)); return; } // Unpack the StartMessage - Protocol.StartMessage startMessage = (Protocol.StartMessage) msg; this.id = startMessage.getId(); this.debugId = startMessage.getDebugId(); InvocationId invocationId = new InvocationIdImpl(startMessage.getDebugId()); @@ -225,10 +224,9 @@ void onStartMessage(MessageLite msg) { this.nextJournalEntry(null, MessageType.InputEntryMessage); this.readEntry( inputMsg -> { - if (!(inputMsg instanceof Protocol.InputEntryMessage)) { + if (!(inputMsg instanceof Protocol.InputEntryMessage inputEntry)) { throw ProtocolException.unexpectedMessage(Protocol.InputEntryMessage.class, inputMsg); } - Protocol.InputEntryMessage inputEntry = (Protocol.InputEntryMessage) inputMsg; Request request = new Request( diff --git a/sdk-core/src/main/java/dev/restate/sdk/core/MessageType.java b/sdk-core/src/main/java/dev/restate/sdk/core/MessageType.java index 49c39a7f..d61e6164 100644 --- a/sdk-core/src/main/java/dev/restate/sdk/core/MessageType.java +++ b/sdk-core/src/main/java/dev/restate/sdk/core/MessageType.java @@ -71,159 +71,88 @@ public enum MessageType { public static final short SIDE_EFFECT_ENTRY_MESSAGE_TYPE = (short) 0x0C05; public Parser messageParser() { - switch (this) { - case StartMessage: - return Protocol.StartMessage.parser(); - case CompletionMessage: - return Protocol.CompletionMessage.parser(); - case SuspensionMessage: - return Protocol.SuspensionMessage.parser(); - case EndMessage: - return Protocol.EndMessage.parser(); - case ErrorMessage: - return Protocol.ErrorMessage.parser(); - case EntryAckMessage: - return Protocol.EntryAckMessage.parser(); - case InputEntryMessage: - return Protocol.InputEntryMessage.parser(); - case OutputEntryMessage: - return Protocol.OutputEntryMessage.parser(); - case GetStateEntryMessage: - return Protocol.GetStateEntryMessage.parser(); - case SetStateEntryMessage: - return Protocol.SetStateEntryMessage.parser(); - case ClearStateEntryMessage: - return Protocol.ClearStateEntryMessage.parser(); - case ClearAllStateEntryMessage: - return Protocol.ClearAllStateEntryMessage.parser(); - case GetStateKeysEntryMessage: - return Protocol.GetStateKeysEntryMessage.parser(); - case GetPromiseEntryMessage: - return Protocol.GetPromiseEntryMessage.parser(); - case PeekPromiseEntryMessage: - return Protocol.PeekPromiseEntryMessage.parser(); - case CompletePromiseEntryMessage: - return Protocol.CompletePromiseEntryMessage.parser(); - case SleepEntryMessage: - return Protocol.SleepEntryMessage.parser(); - case CallEntryMessage: - return Protocol.CallEntryMessage.parser(); - case OneWayCallEntryMessage: - return Protocol.OneWayCallEntryMessage.parser(); - case AwakeableEntryMessage: - return Protocol.AwakeableEntryMessage.parser(); - case CompleteAwakeableEntryMessage: - return Protocol.CompleteAwakeableEntryMessage.parser(); - case CombinatorAwaitableEntryMessage: - return Java.CombinatorAwaitableEntryMessage.parser(); - case RunEntryMessage: - return Protocol.RunEntryMessage.parser(); - } - throw new IllegalStateException(); + return switch (this) { + case StartMessage -> Protocol.StartMessage.parser(); + case CompletionMessage -> Protocol.CompletionMessage.parser(); + case SuspensionMessage -> Protocol.SuspensionMessage.parser(); + case EndMessage -> Protocol.EndMessage.parser(); + case ErrorMessage -> Protocol.ErrorMessage.parser(); + case EntryAckMessage -> Protocol.EntryAckMessage.parser(); + case InputEntryMessage -> Protocol.InputEntryMessage.parser(); + case OutputEntryMessage -> Protocol.OutputEntryMessage.parser(); + case GetStateEntryMessage -> Protocol.GetStateEntryMessage.parser(); + case SetStateEntryMessage -> Protocol.SetStateEntryMessage.parser(); + case ClearStateEntryMessage -> Protocol.ClearStateEntryMessage.parser(); + case ClearAllStateEntryMessage -> Protocol.ClearAllStateEntryMessage.parser(); + case GetStateKeysEntryMessage -> Protocol.GetStateKeysEntryMessage.parser(); + case GetPromiseEntryMessage -> Protocol.GetPromiseEntryMessage.parser(); + case PeekPromiseEntryMessage -> Protocol.PeekPromiseEntryMessage.parser(); + case CompletePromiseEntryMessage -> Protocol.CompletePromiseEntryMessage.parser(); + case SleepEntryMessage -> Protocol.SleepEntryMessage.parser(); + case CallEntryMessage -> Protocol.CallEntryMessage.parser(); + case OneWayCallEntryMessage -> Protocol.OneWayCallEntryMessage.parser(); + case AwakeableEntryMessage -> Protocol.AwakeableEntryMessage.parser(); + case CompleteAwakeableEntryMessage -> Protocol.CompleteAwakeableEntryMessage.parser(); + case CombinatorAwaitableEntryMessage -> Java.CombinatorAwaitableEntryMessage.parser(); + case RunEntryMessage -> Protocol.RunEntryMessage.parser(); + }; } public short encode() { - switch (this) { - case StartMessage: - return START_MESSAGE_TYPE; - case CompletionMessage: - return COMPLETION_MESSAGE_TYPE; - case SuspensionMessage: - return SUSPENSION_MESSAGE_TYPE; - case EndMessage: - return END_MESSAGE_TYPE; - case ErrorMessage: - return ERROR_MESSAGE_TYPE; - case EntryAckMessage: - return ENTRY_ACK_MESSAGE_TYPE; - case InputEntryMessage: - return INPUT_ENTRY_MESSAGE_TYPE; - case OutputEntryMessage: - return OUTPUT_ENTRY_MESSAGE_TYPE; - case GetStateEntryMessage: - return GET_STATE_ENTRY_MESSAGE_TYPE; - case SetStateEntryMessage: - return SET_STATE_ENTRY_MESSAGE_TYPE; - case ClearStateEntryMessage: - return CLEAR_STATE_ENTRY_MESSAGE_TYPE; - case ClearAllStateEntryMessage: - return CLEAR_ALL_STATE_ENTRY_MESSAGE_TYPE; - case GetStateKeysEntryMessage: - return GET_STATE_KEYS_ENTRY_MESSAGE_TYPE; - case GetPromiseEntryMessage: - return GET_PROMISE_ENTRY_MESSAGE_TYPE; - case PeekPromiseEntryMessage: - return PEEK_PROMISE_ENTRY_MESSAGE_TYPE; - case CompletePromiseEntryMessage: - return COMPLETE_PROMISE_ENTRY_MESSAGE_TYPE; - case SleepEntryMessage: - return SLEEP_ENTRY_MESSAGE_TYPE; - case CallEntryMessage: - return INVOKE_ENTRY_MESSAGE_TYPE; - case OneWayCallEntryMessage: - return BACKGROUND_INVOKE_ENTRY_MESSAGE_TYPE; - case AwakeableEntryMessage: - return AWAKEABLE_ENTRY_MESSAGE_TYPE; - case CompleteAwakeableEntryMessage: - return COMPLETE_AWAKEABLE_ENTRY_MESSAGE_TYPE; - case CombinatorAwaitableEntryMessage: - return COMBINATOR_AWAITABLE_ENTRY_MESSAGE_TYPE; - case RunEntryMessage: - return SIDE_EFFECT_ENTRY_MESSAGE_TYPE; - } - throw new IllegalStateException(); + return switch (this) { + case StartMessage -> START_MESSAGE_TYPE; + case CompletionMessage -> COMPLETION_MESSAGE_TYPE; + case SuspensionMessage -> SUSPENSION_MESSAGE_TYPE; + case EndMessage -> END_MESSAGE_TYPE; + case ErrorMessage -> ERROR_MESSAGE_TYPE; + case EntryAckMessage -> ENTRY_ACK_MESSAGE_TYPE; + case InputEntryMessage -> INPUT_ENTRY_MESSAGE_TYPE; + case OutputEntryMessage -> OUTPUT_ENTRY_MESSAGE_TYPE; + case GetStateEntryMessage -> GET_STATE_ENTRY_MESSAGE_TYPE; + case SetStateEntryMessage -> SET_STATE_ENTRY_MESSAGE_TYPE; + case ClearStateEntryMessage -> CLEAR_STATE_ENTRY_MESSAGE_TYPE; + case ClearAllStateEntryMessage -> CLEAR_ALL_STATE_ENTRY_MESSAGE_TYPE; + case GetStateKeysEntryMessage -> GET_STATE_KEYS_ENTRY_MESSAGE_TYPE; + case GetPromiseEntryMessage -> GET_PROMISE_ENTRY_MESSAGE_TYPE; + case PeekPromiseEntryMessage -> PEEK_PROMISE_ENTRY_MESSAGE_TYPE; + case CompletePromiseEntryMessage -> COMPLETE_PROMISE_ENTRY_MESSAGE_TYPE; + case SleepEntryMessage -> SLEEP_ENTRY_MESSAGE_TYPE; + case CallEntryMessage -> INVOKE_ENTRY_MESSAGE_TYPE; + case OneWayCallEntryMessage -> BACKGROUND_INVOKE_ENTRY_MESSAGE_TYPE; + case AwakeableEntryMessage -> AWAKEABLE_ENTRY_MESSAGE_TYPE; + case CompleteAwakeableEntryMessage -> COMPLETE_AWAKEABLE_ENTRY_MESSAGE_TYPE; + case CombinatorAwaitableEntryMessage -> COMBINATOR_AWAITABLE_ENTRY_MESSAGE_TYPE; + case RunEntryMessage -> SIDE_EFFECT_ENTRY_MESSAGE_TYPE; + }; } public static MessageType decode(short value) throws ProtocolException { - switch (value) { - case START_MESSAGE_TYPE: - return StartMessage; - case COMPLETION_MESSAGE_TYPE: - return CompletionMessage; - case SUSPENSION_MESSAGE_TYPE: - return SuspensionMessage; - case END_MESSAGE_TYPE: - return EndMessage; - case ERROR_MESSAGE_TYPE: - return ErrorMessage; - case ENTRY_ACK_MESSAGE_TYPE: - return EntryAckMessage; - case INPUT_ENTRY_MESSAGE_TYPE: - return InputEntryMessage; - case OUTPUT_ENTRY_MESSAGE_TYPE: - return OutputEntryMessage; - case GET_STATE_ENTRY_MESSAGE_TYPE: - return GetStateEntryMessage; - case SET_STATE_ENTRY_MESSAGE_TYPE: - return SetStateEntryMessage; - case CLEAR_STATE_ENTRY_MESSAGE_TYPE: - return ClearStateEntryMessage; - case CLEAR_ALL_STATE_ENTRY_MESSAGE_TYPE: - return ClearAllStateEntryMessage; - case GET_STATE_KEYS_ENTRY_MESSAGE_TYPE: - return GetStateKeysEntryMessage; - case GET_PROMISE_ENTRY_MESSAGE_TYPE: - return GetPromiseEntryMessage; - case PEEK_PROMISE_ENTRY_MESSAGE_TYPE: - return PeekPromiseEntryMessage; - case COMPLETE_PROMISE_ENTRY_MESSAGE_TYPE: - return CompletePromiseEntryMessage; - case SLEEP_ENTRY_MESSAGE_TYPE: - return SleepEntryMessage; - case INVOKE_ENTRY_MESSAGE_TYPE: - return CallEntryMessage; - case BACKGROUND_INVOKE_ENTRY_MESSAGE_TYPE: - return OneWayCallEntryMessage; - case AWAKEABLE_ENTRY_MESSAGE_TYPE: - return AwakeableEntryMessage; - case COMPLETE_AWAKEABLE_ENTRY_MESSAGE_TYPE: - return CompleteAwakeableEntryMessage; - case COMBINATOR_AWAITABLE_ENTRY_MESSAGE_TYPE: - return CombinatorAwaitableEntryMessage; - case SIDE_EFFECT_ENTRY_MESSAGE_TYPE: - return RunEntryMessage; - } - throw ProtocolException.unknownMessageType(value); + return switch (value) { + case START_MESSAGE_TYPE -> StartMessage; + case COMPLETION_MESSAGE_TYPE -> CompletionMessage; + case SUSPENSION_MESSAGE_TYPE -> SuspensionMessage; + case END_MESSAGE_TYPE -> EndMessage; + case ERROR_MESSAGE_TYPE -> ErrorMessage; + case ENTRY_ACK_MESSAGE_TYPE -> EntryAckMessage; + case INPUT_ENTRY_MESSAGE_TYPE -> InputEntryMessage; + case OUTPUT_ENTRY_MESSAGE_TYPE -> OutputEntryMessage; + case GET_STATE_ENTRY_MESSAGE_TYPE -> GetStateEntryMessage; + case SET_STATE_ENTRY_MESSAGE_TYPE -> SetStateEntryMessage; + case CLEAR_STATE_ENTRY_MESSAGE_TYPE -> ClearStateEntryMessage; + case CLEAR_ALL_STATE_ENTRY_MESSAGE_TYPE -> ClearAllStateEntryMessage; + case GET_STATE_KEYS_ENTRY_MESSAGE_TYPE -> GetStateKeysEntryMessage; + case GET_PROMISE_ENTRY_MESSAGE_TYPE -> GetPromiseEntryMessage; + case PEEK_PROMISE_ENTRY_MESSAGE_TYPE -> PeekPromiseEntryMessage; + case COMPLETE_PROMISE_ENTRY_MESSAGE_TYPE -> CompletePromiseEntryMessage; + case SLEEP_ENTRY_MESSAGE_TYPE -> SleepEntryMessage; + case INVOKE_ENTRY_MESSAGE_TYPE -> CallEntryMessage; + case BACKGROUND_INVOKE_ENTRY_MESSAGE_TYPE -> OneWayCallEntryMessage; + case AWAKEABLE_ENTRY_MESSAGE_TYPE -> AwakeableEntryMessage; + case COMPLETE_AWAKEABLE_ENTRY_MESSAGE_TYPE -> CompleteAwakeableEntryMessage; + case COMBINATOR_AWAITABLE_ENTRY_MESSAGE_TYPE -> CombinatorAwaitableEntryMessage; + case SIDE_EFFECT_ENTRY_MESSAGE_TYPE -> RunEntryMessage; + default -> throw ProtocolException.unknownMessageType(value); + }; } public static MessageType fromMessage(MessageLite msg) { diff --git a/sdk-core/src/main/java/dev/restate/sdk/core/RestateEndpoint.java b/sdk-core/src/main/java/dev/restate/sdk/core/RestateEndpoint.java index f161069f..05373da1 100644 --- a/sdk-core/src/main/java/dev/restate/sdk/core/RestateEndpoint.java +++ b/sdk-core/src/main/java/dev/restate/sdk/core/RestateEndpoint.java @@ -253,15 +253,7 @@ public static ServiceDefinitionFactory discoverServiceDefinition + ServiceDefinitionFactorySingleton.INSTANCE.factories); } - private static class ServiceAndOptions { - private final ServiceDefinition service; - private final O options; - - ServiceAndOptions(ServiceDefinition service, O options) { - this.service = service; - this.options = options; - } - } + private record ServiceAndOptions(ServiceDefinition service, O options) {} public static class DiscoveryResponse { private final String contentType; diff --git a/sdk-core/src/main/java/dev/restate/sdk/core/Tracing.java b/sdk-core/src/main/java/dev/restate/sdk/core/Tracing.java index 1a5f41bb..5eec9b46 100644 --- a/sdk-core/src/main/java/dev/restate/sdk/core/Tracing.java +++ b/sdk-core/src/main/java/dev/restate/sdk/core/Tracing.java @@ -14,15 +14,15 @@ final class Tracing { private Tracing() {} - static AttributeKey RESTATE_INVOCATION_ID = + static final AttributeKey RESTATE_INVOCATION_ID = AttributeKey.stringKey("restate.invocation.id"); - static AttributeKey RESTATE_STATE_KEY = AttributeKey.stringKey("restate.state.key"); - static AttributeKey RESTATE_SLEEP_WAKE_UP_TIME = + static final AttributeKey RESTATE_STATE_KEY = AttributeKey.stringKey("restate.state.key"); + static final AttributeKey RESTATE_SLEEP_WAKE_UP_TIME = AttributeKey.longKey("restate.sleep.wake_up_time"); - static AttributeKey RESTATE_COORDINATION_CALL_SERVICE = + static final AttributeKey RESTATE_COORDINATION_CALL_SERVICE = AttributeKey.stringKey("restate.coordination.call.service"); - static AttributeKey RESTATE_COORDINATION_CALL_METHOD = + static final AttributeKey RESTATE_COORDINATION_CALL_METHOD = AttributeKey.stringKey("restate.coordination.call.method"); } diff --git a/sdk-core/src/main/java/dev/restate/sdk/core/Util.java b/sdk-core/src/main/java/dev/restate/sdk/core/Util.java index 25ddecb1..44253d62 100644 --- a/sdk-core/src/main/java/dev/restate/sdk/core/Util.java +++ b/sdk-core/src/main/java/dev/restate/sdk/core/Util.java @@ -47,7 +47,7 @@ static Optional findCause( while (currentThrowable != null) { if (condition.test(currentThrowable)) { - return (Optional) Optional.of(currentThrowable); + return (Optional) Optional.of(currentThrowable); } if (currentThrowable == currentThrowable.getCause()) { diff --git a/sdk-core/src/test/java/dev/restate/sdk/core/ProtoUtils.java b/sdk-core/src/test/java/dev/restate/sdk/core/ProtoUtils.java index 8390d310..9feda75c 100644 --- a/sdk-core/src/test/java/dev/restate/sdk/core/ProtoUtils.java +++ b/sdk-core/src/test/java/dev/restate/sdk/core/ProtoUtils.java @@ -310,9 +310,9 @@ public static Java.CombinatorAwaitableEntryMessage combinatorsMessage(Integer... .build(); } - public static Protocol.EndMessage END_MESSAGE = Protocol.EndMessage.getDefaultInstance(); + public static final Protocol.EndMessage END_MESSAGE = Protocol.EndMessage.getDefaultInstance(); - public static Target GREETER_SERVICE_TARGET = Target.service("Greeter", "greeter"); + public static final Target GREETER_SERVICE_TARGET = Target.service("Greeter", "greeter"); public static Target GREETER_VIRTUAL_OBJECT_TARGET = Target.virtualObject("Greeter", "Francesco", "greeter"); diff --git a/sdk-core/src/test/java/dev/restate/sdk/core/SleepTestSuite.java b/sdk-core/src/test/java/dev/restate/sdk/core/SleepTestSuite.java index 543aacea..efd6b089 100644 --- a/sdk-core/src/test/java/dev/restate/sdk/core/SleepTestSuite.java +++ b/sdk-core/src/test/java/dev/restate/sdk/core/SleepTestSuite.java @@ -23,7 +23,7 @@ public abstract class SleepTestSuite implements TestDefinitions.TestSuite { - Long startTime = System.currentTimeMillis(); + final Long startTime = System.currentTimeMillis(); protected abstract TestInvocationBuilder sleepGreeter(); diff --git a/sdk-core/src/test/java/dev/restate/sdk/core/TestDefinitions.java b/sdk-core/src/test/java/dev/restate/sdk/core/TestDefinitions.java index 46a2e437..131d57dd 100644 --- a/sdk-core/src/test/java/dev/restate/sdk/core/TestDefinitions.java +++ b/sdk-core/src/test/java/dev/restate/sdk/core/TestDefinitions.java @@ -20,6 +20,7 @@ import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.assertj.core.api.InstanceOfAssertFactories; import org.jspecify.annotations.Nullable; public final class TestDefinitions { @@ -178,7 +179,11 @@ public WithInputBuilder enablePreviewContext() { public ExpectingOutputMessages expectingOutput(MessageLiteOrBuilder... messages) { List builtMessages = Arrays.stream(messages).map(ProtoUtils::build).collect(Collectors.toList()); - return assertingOutput(actual -> assertThat(actual).asList().isEqualTo(builtMessages)); + return assertingOutput( + actual -> + assertThat(actual) + .asInstanceOf(InstanceOfAssertFactories.LIST) + .isEqualTo(builtMessages)); } public ExpectingOutputMessages assertingOutput(Consumer> messages) { diff --git a/sdk-core/src/test/java/dev/restate/sdk/core/TestSerdes.java b/sdk-core/src/test/java/dev/restate/sdk/core/TestSerdes.java index fe6f97e7..a5623be6 100644 --- a/sdk-core/src/test/java/dev/restate/sdk/core/TestSerdes.java +++ b/sdk-core/src/test/java/dev/restate/sdk/core/TestSerdes.java @@ -29,7 +29,7 @@ public abstract class TestSerdes { private TestSerdes() {} /** {@link Serde} for {@link String}. This writes and reads {@link String} as JSON value. */ - public static Serde STRING = + public static final Serde STRING = usingJackson( JsonGenerator::writeString, p -> { @@ -41,7 +41,7 @@ private TestSerdes() {} }); /** {@link Serde} for {@link Boolean}. This writes and reads {@link Boolean} as JSON value. */ - public static Serde BOOLEAN = + public static final Serde BOOLEAN = usingJackson( JsonGenerator::writeBoolean, p -> { @@ -68,7 +68,7 @@ private TestSerdes() {} }); /** {@link Serde} for {@link Integer}. This writes and reads {@link Integer} as JSON value. */ - public static Serde INT = + public static final Serde INT = usingJackson( JsonGenerator::writeNumber, p -> { diff --git a/sdk-http-vertx/src/main/java/dev/restate/sdk/http/vertx/RequestHttpServerHandler.java b/sdk-http-vertx/src/main/java/dev/restate/sdk/http/vertx/RequestHttpServerHandler.java index 3dc29356..3342e9b3 100644 --- a/sdk-http-vertx/src/main/java/dev/restate/sdk/http/vertx/RequestHttpServerHandler.java +++ b/sdk-http-vertx/src/main/java/dev/restate/sdk/http/vertx/RequestHttpServerHandler.java @@ -46,7 +46,7 @@ class RequestHttpServerHandler implements Handler { private static final String DISCOVER_PATH = "/discover"; - static TextMapGetter OTEL_TEXT_MAP_GETTER = + static final TextMapGetter OTEL_TEXT_MAP_GETTER = new TextMapGetter<>() { @Override public Iterable keys(MultiMap carrier) { @@ -127,7 +127,7 @@ public void handle(HttpServerRequest request) { return; } - LOG.debug("Handling request to " + serviceName + "/" + handlerName); + LOG.debug("Handling request to {}/{}", serviceName, handlerName); // Prepare the header frame to send in the response. // Vert.x will send them as soon as we send the first write diff --git a/sdk-lambda/src/main/java/dev/restate/sdk/lambda/RestateLambdaEndpoint.java b/sdk-lambda/src/main/java/dev/restate/sdk/lambda/RestateLambdaEndpoint.java index ed87d645..12c6ef2b 100644 --- a/sdk-lambda/src/main/java/dev/restate/sdk/lambda/RestateLambdaEndpoint.java +++ b/sdk-lambda/src/main/java/dev/restate/sdk/lambda/RestateLambdaEndpoint.java @@ -35,7 +35,7 @@ public final class RestateLambdaEndpoint { private static final String INVOKE_PATH_SEGMENT = "invoke"; private static final String DISCOVER_PATH = "/discover"; - private static TextMapGetter> OTEL_HEADERS_GETTER = + private static final TextMapGetter> OTEL_HEADERS_GETTER = new TextMapGetter<>() { @Override public Iterable keys(Map carrier) { diff --git a/sdk-serde-jackson/src/main/java/dev/restate/sdk/serde/jackson/JacksonSerdes.java b/sdk-serde-jackson/src/main/java/dev/restate/sdk/serde/jackson/JacksonSerdes.java index c2bbd437..4e48eca1 100644 --- a/sdk-serde-jackson/src/main/java/dev/restate/sdk/serde/jackson/JacksonSerdes.java +++ b/sdk-serde-jackson/src/main/java/dev/restate/sdk/serde/jackson/JacksonSerdes.java @@ -90,7 +90,6 @@ private JacksonSerdes() {} } } }); - ; schemaGenerator = new SchemaGenerator(configBuilder.build()); } diff --git a/sdk-serde-jackson/src/test/java/dev/restate/sdk/serde/jackson/JacksonSerdesTest.java b/sdk-serde-jackson/src/test/java/dev/restate/sdk/serde/jackson/JacksonSerdesTest.java index 855498a8..8d422ab7 100644 --- a/sdk-serde-jackson/src/test/java/dev/restate/sdk/serde/jackson/JacksonSerdesTest.java +++ b/sdk-serde-jackson/src/test/java/dev/restate/sdk/serde/jackson/JacksonSerdesTest.java @@ -56,9 +56,12 @@ public int hashCode() { } } + public record PersonRecord(String name) {} + private static Stream roundtripTestCases() { return Stream.of( Arguments.of(new Person("Francesco"), JacksonSerdes.of(Person.class)), + Arguments.of(new PersonRecord("Francesco"), JacksonSerdes.of(PersonRecord.class)), Arguments.of( List.of(new Person("Francesco"), new Person("Till")), JacksonSerdes.of(new TypeReference>() {})), diff --git a/sdk-spring-boot-starter/build.gradle.kts b/sdk-spring-boot-starter/build.gradle.kts index 5b5bfa6a..57026a90 100644 --- a/sdk-spring-boot-starter/build.gradle.kts +++ b/sdk-spring-boot-starter/build.gradle.kts @@ -10,8 +10,6 @@ description = "Restate SDK Spring Boot starter" val springBootVersion = "3.3.5" -java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } - dependencies { compileOnly(coreLibs.jspecify) diff --git a/sdk-testing/src/test/java/dev/restate/sdk/testing/Counter.java b/sdk-testing/src/test/java/dev/restate/sdk/testing/Counter.java index 6de862db..483ea606 100644 --- a/sdk-testing/src/test/java/dev/restate/sdk/testing/Counter.java +++ b/sdk-testing/src/test/java/dev/restate/sdk/testing/Counter.java @@ -42,7 +42,7 @@ public long get(ObjectContext ctx) { @Handler public CounterUpdateResult getAndAdd(ObjectContext ctx, Long request) { - LOG.info("Invoked get and add with " + request); + LOG.info("Invoked get and add with {}", request); long currentValue = ctx.get(TOTAL).orElse(0L); long newValue = currentValue + request; @@ -51,21 +51,5 @@ public CounterUpdateResult getAndAdd(ObjectContext ctx, Long request) { return new CounterUpdateResult(newValue, currentValue); } - public static class CounterUpdateResult { - private final Long newValue; - private final Long oldValue; - - public CounterUpdateResult(Long newValue, Long oldValue) { - this.newValue = newValue; - this.oldValue = oldValue; - } - - public Long getNewValue() { - return newValue; - } - - public Long getOldValue() { - return oldValue; - } - } + public record CounterUpdateResult(Long newValue, Long oldValue) {} } diff --git a/settings.gradle.kts b/settings.gradle.kts index df343b5b..c781d15a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -36,7 +36,7 @@ dependencyResolutionManagement { versionCatalogs { create("coreLibs") { - version("protobuf", "4.27.0") + version("protobuf", "4.28.3") version("log4j", "2.23.0") version("opentelemetry", "1.38.0") @@ -59,7 +59,7 @@ dependencyResolutionManagement { library("tink", "com.google.crypto.tink:tink:1.13.0") } create("vertxLibs") { - library("vertx-bom", "io.vertx:vertx-stack-depchain:4.5.8") + library("vertx-bom", "io.vertx:vertx-stack-depchain:4.5.11") library("vertx-core", "io.vertx", "vertx-core").withoutVersion() library("vertx-kotlin-coroutines", "io.vertx", "vertx-lang-kotlin-coroutines") .withoutVersion() @@ -70,7 +70,7 @@ dependencyResolutionManagement { library("events", "com.amazonaws:aws-lambda-java-events:3.11.5") } create("jacksonLibs") { - version("jackson", "2.17.1") + version("jackson", "2.18.1") library("jackson-bom", "com.fasterxml.jackson", "jackson-bom").versionRef("jackson") library("jackson-annotations", "com.fasterxml.jackson.core", "jackson-annotations") @@ -89,13 +89,13 @@ dependencyResolutionManagement { } create("kotlinLibs") { library("kotlinx-coroutines", "org.jetbrains.kotlinx", "kotlinx-coroutines-core") - .version("1.9.0-RC") + .version("1.9.0") library("kotlinx-serialization-core", "org.jetbrains.kotlinx", "kotlinx-serialization-core") - .version("1.6.3") + .version("1.7.3") library("kotlinx-serialization-json", "org.jetbrains.kotlinx", "kotlinx-serialization-json") - .version("1.6.3") + .version("1.7.3") - version("ksp", "2.0.0-1.0.24") + version("ksp", "2.0.21-1.0.28") library("symbol-processing-api", "com.google.devtools.ksp", "symbol-processing-api") .versionRef("ksp") plugin("ksp", "com.google.devtools.ksp").versionRef("ksp")