Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
02d1a94
Advance version
alexander-yevsyukov Apr 23, 2020
0612a11
Update config
alexander-yevsyukov Apr 23, 2020
28974ef
Simplify obtaining tenant
alexander-yevsyukov Apr 23, 2020
c35b68c
Hide method
alexander-yevsyukov Apr 23, 2020
9a88a43
Hide method, document nested class
alexander-yevsyukov Apr 23, 2020
e5b65b2
Improve code layout
alexander-yevsyukov Apr 23, 2020
1f81f36
Move methods to where they belong
alexander-yevsyukov Apr 23, 2020
ce65408
Add null arg. test
alexander-yevsyukov Apr 23, 2020
92775fc
Update config
alexander-yevsyukov Apr 23, 2020
44e7461
Bump versions
alexander-yevsyukov Apr 23, 2020
7aeccb9
Handle errors when posting a command
alexander-yevsyukov Apr 23, 2020
b373c53
Removing mentioning bus in the type doc
alexander-yevsyukov Apr 23, 2020
046765c
Make class final
alexander-yevsyukov Apr 24, 2020
dfa09db
Move delivery to the package level
alexander-yevsyukov Apr 24, 2020
e0d4772
Remove redundant generic param
alexander-yevsyukov Apr 24, 2020
d618eb5
Improve diag message
alexander-yevsyukov Apr 24, 2020
285a712
Suppress `rawtypes` warning
alexander-yevsyukov Apr 24, 2020
5195724
Remove redundant generic param
alexander-yevsyukov Apr 24, 2020
d8a0792
Allow handling consuming errors for command requests
alexander-yevsyukov Apr 24, 2020
769eb47
Fix code layout
alexander-yevsyukov Apr 24, 2020
6dd6662
Improve diag. message
alexander-yevsyukov Apr 28, 2020
00e54cf
Remove redundant article
alexander-yevsyukov Apr 28, 2020
3e62663
Make `LoggingHandler` more general
alexander-yevsyukov Apr 28, 2020
94ad594
Allow custom handler for posting errors
alexander-yevsyukov Apr 28, 2020
543d568
Remove (c) header
alexander-yevsyukov Apr 28, 2020
3c53bce
Merge remote-tracking branch 'remotes/origin/master' into handle-erro…
alexander-yevsyukov Apr 30, 2020
c0227a0
Test consuming error handling
alexander-yevsyukov Apr 30, 2020
24283c1
Test passing the posting error to the handler
alexander-yevsyukov Apr 30, 2020
5065db1
Improve names
alexander-yevsyukov Apr 30, 2020
0020b1d
Simplify simulation of a posting error
alexander-yevsyukov Apr 30, 2020
8e944d5
Auto-updated by IDEA
alexander-yevsyukov Apr 30, 2020
c631931
Update dependency report
alexander-yevsyukov Apr 30, 2020
0b93c5d
Remove unused constant
alexander-yevsyukov Apr 30, 2020
7199732
Verify the content of posted message
alexander-yevsyukov Apr 30, 2020
cf3fc5c
Add missing class Javadoc
alexander-yevsyukov Apr 30, 2020
2f04f3c
Merge remote-tracking branch 'remotes/origin/master' into handle-erro…
alexander-yevsyukov May 5, 2020
f3888b2
Update config
alexander-yevsyukov May 5, 2020
0c70aab
Advance version
alexander-yevsyukov May 5, 2020
817f25f
Update dependency versions
alexander-yevsyukov May 5, 2020
c8c926c
Simplify verification of a response status
alexander-yevsyukov May 6, 2020
2cbcb8a
Move server-side error interfaces to the `server` module
alexander-yevsyukov May 6, 2020
6b2df0b
Deprecate since `Subscribe.filter()` is deprecated already
alexander-yevsyukov May 8, 2020
f93b83d
Add Javadoc
alexander-yevsyukov May 8, 2020
bec28ef
Fix code layout
alexander-yevsyukov May 8, 2020
523dc19
Address deprecation of `ByField`
alexander-yevsyukov May 8, 2020
4c0fa1c
Extract common actor and time properties
alexander-yevsyukov May 8, 2020
e0082cb
Extract common actor and time properties
alexander-yevsyukov May 8, 2020
3a2efe8
Add shortcut method for obtaining the error
alexander-yevsyukov May 8, 2020
3744c9d
Cancel subscriptions asynchronously
alexander-yevsyukov May 8, 2020
2a5e479
Address deprecation of `ByField`
alexander-yevsyukov May 8, 2020
69945cb
Improve class name
alexander-yevsyukov May 8, 2020
c12676f
Pass default error handlers to requests
alexander-yevsyukov May 8, 2020
ef7effd
Update dependency report
alexander-yevsyukov May 8, 2020
58cf515
Remove unnecessary package prefixes
alexander-yevsyukov May 8, 2020
3c8a5c5
Test passing custom error handlers to client request builders
alexander-yevsyukov May 13, 2020
550da48
Deprecate `time()` method
alexander-yevsyukov May 13, 2020
2cfd3f6
Check non-nullity of the returned instant
alexander-yevsyukov May 13, 2020
78b40fc
Use newer API from obtaining an actor
alexander-yevsyukov May 13, 2020
c97e62b
Relax the warning on a field not used inside `if`
alexander-yevsyukov May 13, 2020
1980b4c
Narrow down deprecation suppression
alexander-yevsyukov May 13, 2020
0b75e1b
Hide the interface
alexander-yevsyukov May 13, 2020
fbd0bd8
Improve names and fix visibility
alexander-yevsyukov May 13, 2020
e655a8f
Update time
alexander-yevsyukov May 13, 2020
861fb4d
Fix code layout
alexander-yevsyukov May 14, 2020
a962ad8
Fix Javadoc
alexander-yevsyukov May 14, 2020
5987739
Simplify assertions
alexander-yevsyukov May 14, 2020
0db9bfd
Suppress lambda warnings
alexander-yevsyukov May 14, 2020
af1d76c
Address generic parameter warning
alexander-yevsyukov May 14, 2020
cefd181
Improve class name
alexander-yevsyukov May 14, 2020
9f2a05c
Make a status field required
alexander-yevsyukov May 14, 2020
b5b732a
Remove redundant proto doc
alexander-yevsyukov May 14, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 6 additions & 24 deletions .idea/inspectionProfiles/Project_Default.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

54 changes: 50 additions & 4 deletions client/src/main/java/io/spine/client/Client.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.inprocess.InProcessChannelBuilder;
Expand All @@ -30,6 +31,7 @@
import io.spine.client.grpc.CommandServiceGrpc.CommandServiceBlockingStub;
import io.spine.client.grpc.QueryServiceGrpc;
import io.spine.client.grpc.QueryServiceGrpc.QueryServiceBlockingStub;
import io.spine.core.Ack;
import io.spine.core.Command;
import io.spine.core.TenantId;
import io.spine.core.UserId;
Expand Down Expand Up @@ -102,6 +104,16 @@ public class Client implements AutoCloseable {
/** Active subscriptions maintained by the client. */
private final Subscriptions subscriptions;

/**
* The handler for errors that may occur during asynchronous requests initiated by this client.
*/
private final @Nullable ErrorHandler streamingErrorHandler;

/**
* The handler for errors returned from server side in response to posted messages.
*/
private final @Nullable ServerErrorHandler serverErrorHandler;

/**
* Creates a builder for a client connected to the specified address.
*
Expand Down Expand Up @@ -156,7 +168,9 @@ private Client(Builder builder) {
this.shutdownTimeout = checkNotNull(builder.shutdownTimeout);
this.commandService = CommandServiceGrpc.newBlockingStub(channel);
this.queryService = QueryServiceGrpc.newBlockingStub(channel);
this.subscriptions = new Subscriptions(channel);
this.streamingErrorHandler = builder.streamingErrorHandler;
this.serverErrorHandler = builder.serverErrorHandler;
this.subscriptions = new Subscriptions(channel, streamingErrorHandler, serverErrorHandler);
}

/**
Expand Down Expand Up @@ -214,7 +228,14 @@ public boolean isOpen() {
*/
public ClientRequest onBehalfOf(UserId user) {
checkNotDefaultArg(user);
return new ClientRequest(user, this);
ClientRequest request = new ClientRequest(user, this);
if (streamingErrorHandler != null) {
request.onStreamingError(streamingErrorHandler);
}
if (serverErrorHandler != null) {
request.onServerError(serverErrorHandler);
}
return request;
}

/**
Expand Down Expand Up @@ -269,8 +290,9 @@ ActorRequestFactory requestOf(UserId user) {
/**
* Posts the command to the {@code CommandService}.
*/
void post(Command c) {
commandService.post(c);
Ack post(Command c) {
Ack ack = commandService.post(c);
return ack;
}

/**
Expand Down Expand Up @@ -324,6 +346,9 @@ public static final class Builder {
/** The ID of the user for performing requests on behalf of a non-logged in user. */
private UserId guestUser = DEFAULT_GUEST_ID;

private @Nullable ErrorHandler streamingErrorHandler;
private @Nullable ServerErrorHandler serverErrorHandler;

private Builder(ManagedChannel channel) {
this.channel = checkNotNull(channel);
}
Expand Down Expand Up @@ -404,6 +429,27 @@ public Builder shutdownTimout(long timeout, TimeUnit timeUnit) {
return this;
}

/**
* Assigns a default handler for streaming errors for the asynchronous requests
* initiated by the client.
*/
@CanIgnoreReturnValue
public Builder onStreamingError(ErrorHandler handler) {
this.streamingErrorHandler = checkNotNull(handler);
return this;
}

/**
* Assigns a default handler for an error occurred on the server-side (such as
* validation error) in response to a message posted by the client.
*/
@CanIgnoreReturnValue
public Builder onServerError(ServerErrorHandler handler) {
checkNotNull(handler);
this.serverErrorHandler = handler;
return this;
}

/**
* Creates a new instance of the client.
*/
Expand Down
41 changes: 41 additions & 0 deletions client/src/main/java/io/spine/client/ClientRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,13 @@

package io.spine.client;

import com.google.errorprone.annotations.CanIgnoreReturnValue;
import com.google.errorprone.annotations.OverridingMethodsMustInvokeSuper;
import io.spine.base.CommandMessage;
import io.spine.base.EntityState;
import io.spine.base.EventMessage;
import io.spine.core.UserId;
import org.checkerframework.checker.nullness.qual.Nullable;

import static com.google.common.base.Preconditions.checkNotNull;
import static io.spine.util.Preconditions2.checkNotDefaultArg;
Expand All @@ -47,6 +50,9 @@ public class ClientRequest {
private final UserId user;
private final Client client;

private @Nullable ErrorHandler streamingErrorHandler;
private @Nullable ServerErrorHandler serverErrorHandler;

ClientRequest(UserId user, Client client) {
checkNotDefaultArg(user);
this.user = user;
Expand All @@ -55,12 +61,15 @@ public class ClientRequest {

ClientRequest(ClientRequest parent) {
this(parent.user, parent.client);
this.streamingErrorHandler = parent.streamingErrorHandler;
this.serverErrorHandler = parent.serverErrorHandler;
}

/**
* Creates a builder for customizing command request.
*/
public CommandRequest command(CommandMessage c) {
checkNotNull(c);
return new CommandRequest(this, c);
}

Expand Down Expand Up @@ -100,4 +109,36 @@ protected final UserId user() {
protected final Client client() {
return client;
}

/**
* Assigns a handler for errors occurred when delivering messages from the server.
*
* <p>If such an error occurs, no more results are expected from the server.
*/
@CanIgnoreReturnValue
@OverridingMethodsMustInvokeSuper
public ClientRequest onStreamingError(ErrorHandler handler) {
this.streamingErrorHandler = checkNotNull(handler);
return this;
}

/**
* Assigns a handler for an error occurred on the server-side (such as validation error)
* in response to posting a request.
*/
@CanIgnoreReturnValue
@OverridingMethodsMustInvokeSuper
public ClientRequest onServerError(ServerErrorHandler handler) {
checkNotNull(handler);
this.serverErrorHandler = handler;
return this;
}

final @Nullable ErrorHandler streamingErrorHandler() {
return streamingErrorHandler;
}

final @Nullable ServerErrorHandler serverErrorHandler() {
return serverErrorHandler;
}
}
Loading