diff --git a/sdk-api-gen/src/test/java/dev/restate/sdk/CodegenTest.java b/sdk-api-gen/src/test/java/dev/restate/sdk/CodegenTest.java index 0b73e4cc..128b2f14 100644 --- a/sdk-api-gen/src/test/java/dev/restate/sdk/CodegenTest.java +++ b/sdk-api-gen/src/test/java/dev/restate/sdk/CodegenTest.java @@ -19,6 +19,7 @@ import dev.restate.sdk.core.ProtoUtils; import dev.restate.sdk.core.TestDefinitions; import dev.restate.sdk.core.TestDefinitions.TestSuite; +import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.stream.Stream; @@ -182,6 +183,14 @@ public String sharedHandler(SharedWorkflowContext context, String myInput) { } } + @Service + static class CheckedException { + @Handler + String greet(Context context, String request) throws IOException { + return request; + } + } + @Override public Stream definitions() { return Stream.of( diff --git a/sdk-api/src/main/java/dev/restate/sdk/HandlerRunner.java b/sdk-api/src/main/java/dev/restate/sdk/HandlerRunner.java index 9f123741..f19e2dcd 100644 --- a/sdk-api/src/main/java/dev/restate/sdk/HandlerRunner.java +++ b/sdk-api/src/main/java/dev/restate/sdk/HandlerRunner.java @@ -9,6 +9,10 @@ package dev.restate.sdk; import dev.restate.sdk.common.TerminalException; +import dev.restate.sdk.common.function.ThrowingBiConsumer; +import dev.restate.sdk.common.function.ThrowingBiFunction; +import dev.restate.sdk.common.function.ThrowingConsumer; +import dev.restate.sdk.common.function.ThrowingFunction; import dev.restate.sdk.common.syscalls.HandlerSpecification; import dev.restate.sdk.common.syscalls.SyscallCallback; import dev.restate.sdk.common.syscalls.Syscalls; @@ -16,10 +20,6 @@ import java.nio.ByteBuffer; import java.util.concurrent.Executor; import java.util.concurrent.Executors; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Function; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jspecify.annotations.Nullable; @@ -27,13 +27,13 @@ /** Adapter class for {@link dev.restate.sdk.common.syscalls.HandlerRunner} to use the Java API. */ public class HandlerRunner implements dev.restate.sdk.common.syscalls.HandlerRunner { - private final BiFunction runner; + private final ThrowingBiFunction runner; private static final Logger LOG = LogManager.getLogger(HandlerRunner.class); - HandlerRunner(BiFunction runner) { + HandlerRunner(ThrowingBiFunction runner) { //noinspection unchecked - this.runner = (BiFunction) runner; + this.runner = (ThrowingBiFunction) runner; } @Override @@ -106,18 +106,19 @@ public void run( } public static HandlerRunner of( - BiFunction runner) { + ThrowingBiFunction runner) { return new HandlerRunner<>(runner); } @SuppressWarnings("unchecked") - public static HandlerRunner of(Function runner) { + public static HandlerRunner of( + ThrowingFunction runner) { return new HandlerRunner<>((context, o) -> runner.apply((CTX) context)); } @SuppressWarnings("unchecked") public static HandlerRunner of( - BiConsumer runner) { + ThrowingBiConsumer runner) { return new HandlerRunner<>( (context, o) -> { runner.accept((CTX) context, o); @@ -126,7 +127,7 @@ public static HandlerRunner of( } @SuppressWarnings("unchecked") - public static HandlerRunner of(Consumer runner) { + public static HandlerRunner of(ThrowingConsumer runner) { return new HandlerRunner<>( (ctx, o) -> { runner.accept((CTX) ctx); diff --git a/sdk-api/src/test/java/dev/restate/sdk/JavaBlockingTests.java b/sdk-api/src/test/java/dev/restate/sdk/JavaBlockingTests.java index 99e0dde3..cf1ec6b1 100644 --- a/sdk-api/src/test/java/dev/restate/sdk/JavaBlockingTests.java +++ b/sdk-api/src/test/java/dev/restate/sdk/JavaBlockingTests.java @@ -13,6 +13,7 @@ import dev.restate.sdk.common.HandlerType; import dev.restate.sdk.common.Serde; import dev.restate.sdk.common.ServiceType; +import dev.restate.sdk.common.function.ThrowingBiFunction; import dev.restate.sdk.common.syscalls.HandlerDefinition; import dev.restate.sdk.common.syscalls.HandlerSpecification; import dev.restate.sdk.common.syscalls.ServiceDefinition; @@ -24,7 +25,6 @@ import dev.restate.sdk.core.TestDefinitions.TestSuite; import dev.restate.sdk.core.TestRunner; import java.util.List; -import java.util.function.BiFunction; import java.util.stream.Stream; public class JavaBlockingTests extends TestRunner { @@ -52,7 +52,7 @@ public Stream definitions() { } public static TestInvocationBuilder testDefinitionForService( - String name, Serde reqSerde, Serde resSerde, BiFunction runner) { + String name, Serde reqSerde, Serde resSerde, ThrowingBiFunction runner) { return TestDefinitions.testInvocation( ServiceDefinition.of( name, @@ -65,7 +65,10 @@ public static TestInvocationBuilder testDefinitionForService( } public static TestInvocationBuilder testDefinitionForVirtualObject( - String name, Serde reqSerde, Serde resSerde, BiFunction runner) { + String name, + Serde reqSerde, + Serde resSerde, + ThrowingBiFunction runner) { return TestDefinitions.testInvocation( ServiceDefinition.of( name, @@ -78,7 +81,10 @@ public static TestInvocationBuilder testDefinitionForVirtualObject( } public static TestInvocationBuilder testDefinitionForWorkflow( - String name, Serde reqSerde, Serde resSerde, BiFunction runner) { + String name, + Serde reqSerde, + Serde resSerde, + ThrowingBiFunction runner) { return TestDefinitions.testInvocation( ServiceDefinition.of( name, diff --git a/sdk-api/src/test/java/dev/restate/sdk/SideEffectTest.java b/sdk-api/src/test/java/dev/restate/sdk/SideEffectTest.java index 60556d9a..1c6596d5 100644 --- a/sdk-api/src/test/java/dev/restate/sdk/SideEffectTest.java +++ b/sdk-api/src/test/java/dev/restate/sdk/SideEffectTest.java @@ -117,8 +117,7 @@ protected TestInvocationBuilder failingSideEffectWithRetryPolicy( Serde.VOID, JsonSerdes.STRING, (ctx, unused) -> { - PreviewContext.run( - ctx, + ctx.run( retryPolicy, () -> { throw new IllegalStateException(reason); diff --git a/sdk-common/src/main/java/dev/restate/sdk/common/function/ThrowingBiFunction.java b/sdk-common/src/main/java/dev/restate/sdk/common/function/ThrowingBiFunction.java new file mode 100644 index 00000000..c00e6740 --- /dev/null +++ b/sdk-common/src/main/java/dev/restate/sdk/common/function/ThrowingBiFunction.java @@ -0,0 +1,15 @@ +// Copyright (c) 2023 - Restate Software, Inc., Restate GmbH +// +// This file is part of the Restate Java SDK, +// which is released under the MIT license. +// +// You can find a copy of the license in file LICENSE in the root +// directory of this repository or package, or at +// https://github.com/restatedev/sdk-java/blob/main/LICENSE +package dev.restate.sdk.common.function; + +/** Like {@link java.util.function.BiFunction} but can throw checked exceptions. */ +@FunctionalInterface +public interface ThrowingBiFunction { + R apply(T var1, U var2) throws Throwable; +} diff --git a/sdk-common/src/main/java/dev/restate/sdk/common/function/ThrowingConsumer.java b/sdk-common/src/main/java/dev/restate/sdk/common/function/ThrowingConsumer.java new file mode 100644 index 00000000..361ebc68 --- /dev/null +++ b/sdk-common/src/main/java/dev/restate/sdk/common/function/ThrowingConsumer.java @@ -0,0 +1,17 @@ +// Copyright (c) 2023 - Restate Software, Inc., Restate GmbH +// +// This file is part of the Restate Java SDK, +// which is released under the MIT license. +// +// You can find a copy of the license in file LICENSE in the root +// directory of this repository or package, or at +// https://github.com/restatedev/sdk-java/blob/main/LICENSE +package dev.restate.sdk.common.function; + +import java.util.function.Consumer; + +/** Like {@link Consumer} but can throw checked exceptions. */ +@FunctionalInterface +public interface ThrowingConsumer { + void accept(T var1) throws Throwable; +}