diff --git a/nexus-sdk/src/main/java/io/nexusrpc/client/CompleteOperationOptions.java b/nexus-sdk/src/main/java/io/nexusrpc/client/CompleteOperationOptions.java new file mode 100644 index 0000000..92a2b9c --- /dev/null +++ b/nexus-sdk/src/main/java/io/nexusrpc/client/CompleteOperationOptions.java @@ -0,0 +1,61 @@ +package io.nexusrpc.client; + +import io.nexusrpc.Link; +import java.time.Instant; +import java.util.List; +import java.util.Map; + +/** CompleteOperationOptions are options for the CompleteOperation client and server APIs. */ +public class CompleteOperationOptions { + public static Builder newBuilder() { + return new Builder(); + } + + private final Map headers; + private final Instant startTime; + private final List links; + + private CompleteOperationOptions( + Map headers, Instant startTime, List links) { + this.headers = headers; + this.startTime = startTime; + this.links = links; + } + + public List getLinks() { + return links; + } + + public Instant getStartTime() { + return startTime; + } + + public Map getHeaders() { + return headers; + } + + public static class Builder { + private Map headers; + private Instant startTime; + private List links; + + public Builder setHeaders(Map headers) { + this.headers = headers; + return this; + } + + public Builder setStartTime(Instant startTime) { + this.startTime = startTime; + return this; + } + + public Builder setLinks(List links) { + this.links = links; + return this; + } + + public CompleteOperationOptions build() { + return new CompleteOperationOptions(headers, startTime, links); + } + } +} diff --git a/nexus-sdk/src/main/java/io/nexusrpc/client/CompletionClient.java b/nexus-sdk/src/main/java/io/nexusrpc/client/CompletionClient.java new file mode 100644 index 0000000..6db3945 --- /dev/null +++ b/nexus-sdk/src/main/java/io/nexusrpc/client/CompletionClient.java @@ -0,0 +1,70 @@ +package io.nexusrpc.client; + +import io.nexusrpc.OperationException; +import io.nexusrpc.client.transport.Transport; + +/** CompletionClient is used to complete or fail async operations. */ +public class CompletionClient { + private final Transport transport; + + // TODO take CompleteOperationOptions as a parameter? + public CompletionClient(Transport transport) { + this.transport = transport; + } + + /** + * Complete an operation identified with the given token and result. + * + * @param token the operation token + * @param result the result of the operation + */ + void completeOperation(String token, Object result) { + completeOperation(token, result, CompleteOperationOptions.newBuilder().build()); + } + + /** + * Complete an operation identified with the given token and result. + * + * @param token the operation token + * @param result the result of the operation + * @param options additional options for completing the operation + */ + void completeOperation(String token, Object result, CompleteOperationOptions options) { + transport.completeOperation( + token, + io.nexusrpc.client.transport.CompleteOperationOptions.newBuilder() + .setResult(result) + .setOperationToken(token) + .setLinks(options.getLinks()) + .setStartTime(options.getStartTime()) + .build()); + } + + /** + * Fail an operation identified with the given token and result. + * + * @param token the operation token + * @param error the error that caused the operation to fail + */ + void failOperation(String token, OperationException error) { + failOperation(token, error, CompleteOperationOptions.newBuilder().build()); + } + + /** + * Fail an operation identified with the given token and result. + * + * @param token the operation token + * @param error the error that caused the operation to fail + * @param options additional options for failing the operation + */ + void failOperation(String token, OperationException error, CompleteOperationOptions options) { + transport.completeOperation( + token, + io.nexusrpc.client.transport.CompleteOperationOptions.newBuilder() + .setError(error) + .setOperationToken(token) + .setLinks(options.getLinks()) + .setStartTime(options.getStartTime()) + .build()); + } +} diff --git a/nexus-sdk/src/main/java/io/nexusrpc/client/transport/CompleteOperationOptions.java b/nexus-sdk/src/main/java/io/nexusrpc/client/transport/CompleteOperationOptions.java new file mode 100644 index 0000000..b462c73 --- /dev/null +++ b/nexus-sdk/src/main/java/io/nexusrpc/client/transport/CompleteOperationOptions.java @@ -0,0 +1,104 @@ +package io.nexusrpc.client.transport; + +import io.nexusrpc.Experimental; +import io.nexusrpc.Link; +import io.nexusrpc.OperationException; +import java.time.Instant; +import java.util.List; +import java.util.Map; + +@Experimental +public class CompleteOperationOptions { + public static Builder newBuilder() { + return new Builder(); + } + + private final Map headers; + private final Object result; + private final OperationException error; + private final String operationToken; + private final Instant startTime; + private final List links; + + private CompleteOperationOptions( + Map headers, + Object result, + OperationException error, + String operationToken, + Instant startTime, + List links) { + this.headers = headers; + this.result = result; + this.error = error; + this.operationToken = operationToken; + this.startTime = startTime; + this.links = links; + } + + public String getOperationToken() { + return operationToken; + } + + public List getLinks() { + return links; + } + + public Instant getStartTime() { + return startTime; + } + + public OperationException getError() { + return error; + } + + public Object getResult() { + return result; + } + + public Map getHeaders() { + return headers; + } + + public static class Builder { + private Map headers; + private Object result; + private OperationException error; + private String operationToken; + private Instant startTime; + private List links; + + public Builder setHeaders(Map headers) { + this.headers = headers; + return this; + } + + public Builder setResult(Object result) { + this.result = result; + return this; + } + + public Builder setError(OperationException error) { + this.error = error; + return this; + } + + public Builder setOperationToken(String operationToken) { + this.operationToken = operationToken; + return this; + } + + public Builder setStartTime(Instant startTime) { + this.startTime = startTime; + return this; + } + + public Builder setLinks(List links) { + this.links = links; + return this; + } + + public CompleteOperationOptions build() { + return new CompleteOperationOptions(headers, result, error, operationToken, startTime, links); + } + } +} diff --git a/nexus-sdk/src/main/java/io/nexusrpc/client/transport/CompleteOperationResponse.java b/nexus-sdk/src/main/java/io/nexusrpc/client/transport/CompleteOperationResponse.java new file mode 100644 index 0000000..a1acfd5 --- /dev/null +++ b/nexus-sdk/src/main/java/io/nexusrpc/client/transport/CompleteOperationResponse.java @@ -0,0 +1,6 @@ +package io.nexusrpc.client.transport; + +import io.nexusrpc.Experimental; + +@Experimental +public class CompleteOperationResponse {} diff --git a/nexus-sdk/src/main/java/io/nexusrpc/client/transport/Transport.java b/nexus-sdk/src/main/java/io/nexusrpc/client/transport/Transport.java index 1f245a6..19b6094 100644 --- a/nexus-sdk/src/main/java/io/nexusrpc/client/transport/Transport.java +++ b/nexus-sdk/src/main/java/io/nexusrpc/client/transport/Transport.java @@ -1,16 +1,23 @@ package io.nexusrpc.client.transport; +import io.nexusrpc.Experimental; +import io.nexusrpc.OperationException; +import io.nexusrpc.OperationStillRunningException; import java.util.concurrent.CompletableFuture; +/** Transport interface for Nexus RPC operations. */ +@Experimental public interface Transport { StartOperationResponse startOperation( - String operationName, String serviceName, StartOperationOptions options); + String operationName, String serviceName, Object input, StartOperationOptions options) + throws OperationException; GetOperationResultResponse getOperationResult( String operationName, String serviceName, String operationToken, - GetOperationResultOptions options); + GetOperationResultOptions options) + throws OperationException, OperationStillRunningException; GetOperationInfoResponse getOperationInfo( String operationName, @@ -24,6 +31,9 @@ CancelOperationResponse cancelOperation( String operationToken, CancelOperationOptions options); + CompleteOperationResponse completeOperation( + String operationToken, CompleteOperationOptions options); + CompletableFuture startOperationAsync( String operationName, String serviceName, @@ -47,4 +57,7 @@ CompletableFuture cancelOperationAsync( String serviceName, String operationToken, CancelOperationOptions options); + + CompletableFuture completeOperationAsync( + String operationToken, CompleteOperationOptions options); }