Skip to content

Commit 62edcd5

Browse files
committed
Remove MethodType enum and refactor gRPC methods to use explicit client/server streaming flags.
Motivation: - Simplify gRPC method definitions by replacing the `MethodType` enum with boolean flags for `clientStreaming` and `serverStreaming`. - Align with recent changes in transport schema and improve readability. Changes: - Removed `MethodType` and replaced its usage with `Boolean clientStreaming` and `Boolean serverStreaming` in `ServiceMethod` and related interfaces. - Updated `TranscodingServiceMethod` and `TranscodingInvoker` implementations to reflect the new flags. - Modified template files, generated code, and test cases to align with updated method definitions. - Added a new example for server streaming with transcoding options.
1 parent 5697d2f commit 62edcd5

9 files changed

Lines changed: 125 additions & 89 deletions

File tree

vertx-grpc-common/src/main/java/io/vertx/grpc/common/MethodType.java

Lines changed: 0 additions & 58 deletions
This file was deleted.

vertx-grpc-common/src/main/java/io/vertx/grpc/common/ServiceMethod.java

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,10 @@
1919
public interface ServiceMethod<I, O> {
2020

2121
static <Req, Resp> ServiceMethod<Resp, Req> client(ServiceName serviceName, String methodName, GrpcMessageEncoder<Req> encoder, GrpcMessageDecoder<Resp> decoder) {
22-
return client(serviceName, methodName, null, encoder, decoder);
22+
return client(serviceName, methodName, null, null, encoder, decoder);
2323
}
2424

25-
static <Req, Resp> ServiceMethod<Resp, Req> client(ServiceName serviceName, String methodName, boolean clientStreaming, boolean serverStreaming, GrpcMessageEncoder<Req> encoder, GrpcMessageDecoder<Resp> decoder) {
26-
return client(serviceName, methodName, MethodType.of(clientStreaming, serverStreaming), encoder, decoder);
27-
}
28-
29-
private static <Req, Resp> ServiceMethod<Resp, Req> client(ServiceName serviceName, String methodName, MethodType type, GrpcMessageEncoder<Req> encoder, GrpcMessageDecoder<Resp> decoder) {
25+
static <Req, Resp> ServiceMethod<Resp, Req> client(ServiceName serviceName, String methodName, Boolean clientStreaming, Boolean serverStreaming, GrpcMessageEncoder<Req> encoder, GrpcMessageDecoder<Resp> decoder) {
3026
return new ServiceMethod<>() {
3127
@Override
3228
public ServiceName serviceName() {
@@ -37,12 +33,12 @@ public String methodName() {
3733
return methodName;
3834
}
3935
@Override
40-
public boolean clientStreaming() {
41-
return type.clientStreaming();
36+
public Boolean clientStreaming() {
37+
return clientStreaming;
4238
}
4339
@Override
44-
public boolean serverStreaming() {
45-
return type.serverStreaming();
40+
public Boolean serverStreaming() {
41+
return serverStreaming;
4642
}
4743
@Override
4844
public GrpcMessageDecoder<Resp> decoder() {
@@ -56,14 +52,10 @@ public GrpcMessageEncoder<Req> encoder() {
5652
}
5753

5854
static <Req, Resp> ServiceMethod<Req, Resp> server(ServiceName serviceName, String methodName, GrpcMessageEncoder<Resp> encoder, GrpcMessageDecoder<Req> decoder) {
59-
return server(serviceName, methodName, null, encoder, decoder);
60-
}
61-
62-
static <Req, Resp> ServiceMethod<Req, Resp> server(ServiceName serviceName, String methodName, boolean clientStreaming, boolean serverStreaming, GrpcMessageEncoder<Resp> encoder, GrpcMessageDecoder<Req> decoder) {
63-
return server(serviceName, methodName, MethodType.of(clientStreaming, serverStreaming), encoder, decoder);
55+
return server(serviceName, methodName, null, null, encoder, decoder);
6456
}
6557

66-
private static <Req, Resp> ServiceMethod<Req, Resp> server(ServiceName serviceName, String methodName, MethodType type, GrpcMessageEncoder<Resp> encoder, GrpcMessageDecoder<Req> decoder) {
58+
static <Req, Resp> ServiceMethod<Req, Resp> server(ServiceName serviceName, String methodName, Boolean clientStreaming, Boolean serverStreaming, GrpcMessageEncoder<Resp> encoder, GrpcMessageDecoder<Req> decoder) {
6759
return new ServiceMethod<>() {
6860
@Override
6961
public ServiceName serviceName() {
@@ -74,12 +66,12 @@ public String methodName() {
7466
return methodName;
7567
}
7668
@Override
77-
public boolean clientStreaming() {
78-
return type.clientStreaming();
69+
public Boolean clientStreaming() {
70+
return clientStreaming;
7971
}
8072
@Override
81-
public boolean serverStreaming() {
82-
return type.serverStreaming();
73+
public Boolean serverStreaming() {
74+
return serverStreaming;
8375
}
8476
@Override
8577
public GrpcMessageDecoder<Req> decoder() {
@@ -103,17 +95,17 @@ public GrpcMessageEncoder<Resp> encoder() {
10395
String methodName();
10496

10597
/**
106-
* @return whether the client side sends a stream of requests
98+
* @return whether the client side sends a stream of requests, {@code null} when this is not known
10799
*/
108-
default boolean clientStreaming() {
109-
return false;
100+
default Boolean clientStreaming() {
101+
return null;
110102
}
111103

112104
/**
113-
* @return whether the server side sends a stream of responses
105+
* @return whether the server side sends a stream of responses, {@code null} when this is not known
114106
*/
115-
default boolean serverStreaming() {
116-
return false;
107+
default Boolean serverStreaming() {
108+
return null;
117109
}
118110

119111
/**

vertx-grpc-docs/src/main/java/examples/grpc/GreeterGrpcService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ public static Service of(GreeterService service) {
8787
public static final io.vertx.grpc.transcoding.TranscodingServiceMethod<examples.grpc.HelloRequest, examples.grpc.HelloReply> SayHello = io.vertx.grpc.transcoding.TranscodingServiceMethod.server(
8888
SERVICE_NAME,
8989
"SayHello",
90+
false,
91+
false,
9092
GrpcMessageEncoder.encoder(),
9193
GrpcMessageDecoder.decoder(examples.grpc.HelloRequest.newBuilder()),
9294
SayHello_OPTIONS

vertx-grpc-it/src/test/java/io/vertx/grpc/it/EventBusTest.java

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,16 @@
22

33
import io.grpc.*;
44
import io.grpc.examples.helloworld.*;
5+
import io.grpc.examples.streamingtranscoding.StreamingHelloReply;
6+
import io.grpc.examples.streamingtranscoding.StreamingHelloRequest;
7+
import io.grpc.examples.streamingtranscoding.StreamingTranscodingGreeterClient;
8+
import io.grpc.examples.streamingtranscoding.StreamingTranscodingGreeterGrpcClient;
9+
import io.grpc.examples.streamingtranscoding.StreamingTranscodingGreeterGrpcService;
10+
import io.grpc.examples.streamingtranscoding.StreamingTranscodingGreeterService;
511
import io.grpc.stub.StreamObserver;
612
import io.vertx.core.Future;
713
import io.vertx.core.Promise;
14+
import io.vertx.core.streams.WriteStream;
815
import io.vertx.ext.unit.TestContext;
916
import io.vertx.grpc.client.InvalidStatusException;
1017
import io.vertx.grpc.common.GrpcStatus;
@@ -18,6 +25,9 @@
1825
import org.junit.Before;
1926
import org.junit.Test;
2027

28+
import java.util.ArrayList;
29+
import java.util.Arrays;
30+
import java.util.List;
2131
import java.util.concurrent.TimeUnit;
2232
import java.util.concurrent.atomic.AtomicReference;
2333

@@ -112,7 +122,6 @@ public Future<HelloReply> sayHello(HelloRequest request) {
112122

113123
@Test
114124
public void testServerClose() throws Exception {
115-
116125
server.addService(greeterService);
117126
GreeterClient greeter = GreeterGrpcClient.create(client);
118127

@@ -133,8 +142,36 @@ public void testServerClose() throws Exception {
133142
}
134143

135144
@Test
136-
public void testGrpcIO() throws Exception {
145+
public void testServerStreamingWithTranscodingOptions() throws Exception {
146+
server.addService(StreamingTranscodingGreeterGrpcService.of(new StreamingTranscodingGreeterService() {
147+
@Override
148+
protected void sayHelloStreaming(StreamingHelloRequest request, WriteStream<StreamingHelloReply> response) {
149+
response.write(StreamingHelloReply.newBuilder().setMessage("Hello " + request.getName() + " 1").build());
150+
response.write(StreamingHelloReply.newBuilder().setMessage("Hello " + request.getName() + " 2").build());
151+
response.write(StreamingHelloReply.newBuilder().setMessage("Hello " + request.getName() + " 3").build());
152+
response.end();
153+
}
154+
}));
137155

156+
StreamingTranscodingGreeterClient greeter = StreamingTranscodingGreeterGrpcClient.create(client);
157+
158+
List<String> received = greeter
159+
.sayHelloStreaming(StreamingHelloRequest.newBuilder().setName("Julien").build())
160+
.compose(stream -> {
161+
Promise<List<String>> promise = Promise.promise();
162+
List<String> replies = new ArrayList<>();
163+
stream.handler(reply -> replies.add(reply.getMessage()));
164+
stream.endHandler(v -> promise.tryComplete(replies));
165+
stream.exceptionHandler(promise::tryFail);
166+
return promise.future();
167+
})
168+
.await(10, TimeUnit.SECONDS);
169+
170+
assertEquals(Arrays.asList("Hello Julien 1", "Hello Julien 2", "Hello Julien 3"), received);
171+
}
172+
173+
@Test
174+
public void testGrpcIO() throws Exception {
138175
GreeterGrpc.GreeterImplBase service = new GreeterGrpc.GreeterImplBase() {
139176
@Override
140177
public void sayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
syntax = "proto3";
2+
3+
import "google/api/annotations.proto";
4+
5+
option java_multiple_files = true;
6+
option java_package = "io.grpc.examples.streamingtranscoding";
7+
option java_outer_classname = "HelloStreamingTranscodingProto";
8+
9+
package streamingtranscoding;
10+
11+
// A greeter whose streaming methods also carry HTTP transcoding rules, so that
12+
// the generated service methods are TranscodingServiceMethod instances that
13+
// report a streaming cardinality.
14+
service StreamingTranscodingGreeter {
15+
rpc SayHelloStreaming (StreamingHelloRequest) returns (stream StreamingHelloReply) {
16+
option (google.api.http) = {
17+
get: "/v1/hello/stream/{name}"
18+
};
19+
}
20+
}
21+
22+
// The request message containing the user's name.
23+
message StreamingHelloRequest {
24+
string name = 1;
25+
}
26+
27+
// The response message containing the greetings
28+
message StreamingHelloReply {
29+
string message = 1;
30+
}

vertx-grpc-protoc-plugin2/src/main/resources/grpc-service.mustache

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ public class {{grpcServiceFqn}} extends {{serviceFqn}} implements Service {
117117
public static final io.vertx.grpc.transcoding.TranscodingServiceMethod<{{inputType}}, {{outputType}}> {{methodName}} = io.vertx.grpc.transcoding.TranscodingServiceMethod.server(
118118
SERVICE_NAME,
119119
"{{methodName}}",
120+
{{isManyInput}},
121+
{{isManyOutput}},
120122
GrpcMessageEncoder.encoder(),
121123
GrpcMessageDecoder.decoder({{inputType}}.newBuilder()),
122124
{{methodName}}_OPTIONS

vertx-grpc-transcoding/src/main/java/io/vertx/grpc/transcoding/TranscodingServiceMethod.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,19 @@ static <Req, Resp> TranscodingServiceMethod<Req, Resp> server(ServiceName servic
2727
return new TranscodingServiceMethodImpl<>(serviceName, methodName, encoder, decoder, options);
2828
}
2929

30+
static <Req, Resp> TranscodingServiceMethod<Req, Resp> server(ServiceName serviceName,
31+
String methodName,
32+
Boolean clientStreaming,
33+
Boolean serverStreaming,
34+
GrpcMessageEncoder<Resp> encoder,
35+
GrpcMessageDecoder<Req> decoder,
36+
MethodTranscodingOptions options) {
37+
return new TranscodingServiceMethodImpl<>(serviceName, methodName, clientStreaming, serverStreaming, encoder, decoder, options);
38+
}
39+
3040
static <Req, Resp> TranscodingServiceMethod<Req, Resp> server(ServiceMethod<Req, Resp> serviceMethod,
3141
MethodTranscodingOptions options) {
32-
return server(serviceMethod.serviceName(), serviceMethod.methodName(), serviceMethod.encoder(), serviceMethod.decoder(), options);
42+
return server(serviceMethod.serviceName(), serviceMethod.methodName(), serviceMethod.clientStreaming(), serviceMethod.serverStreaming(), serviceMethod.encoder(), serviceMethod.decoder(), options);
3343
}
3444

3545
MethodTranscodingOptions options();

vertx-grpc-transcoding/src/main/java/io/vertx/grpc/transcoding/impl/TranscodingInvoker.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,11 @@ public <Req, Resp> GrpcInvocation accept(HttpServerRequest request, ServiceMetho
2828
transcodingServiceMethod = new TranscodingServiceMethodImpl<>(
2929
serviceMethod.serviceName(),
3030
serviceMethod.methodName(),
31+
serviceMethod.clientStreaming(),
32+
serviceMethod.serverStreaming(),
3133
serviceMethod.encoder(),
32-
serviceMethod.decoder()
34+
serviceMethod.decoder(),
35+
null
3336
);
3437
}
3538

vertx-grpc-transcoding/src/main/java/io/vertx/grpc/transcoding/impl/TranscodingServiceMethodImpl.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,27 @@ public class TranscodingServiceMethodImpl<I, O> implements TranscodingServiceMet
2424

2525
private final ServiceName serviceName;
2626
private final String methodName;
27+
private final Boolean clientStreaming;
28+
private final Boolean serverStreaming;
2729
private final GrpcMessageEncoder<O> encoder;
2830
private final GrpcMessageDecoder<I> decoder;
2931
private final MethodTranscodingOptions options;
3032

3133
private final PathMatcher pathMatcher;
3234

3335
public TranscodingServiceMethodImpl(ServiceName serviceName, String methodName, GrpcMessageEncoder<O> encoder, GrpcMessageDecoder<I> decoder) {
34-
this(serviceName, methodName, encoder, decoder, null);
36+
this(serviceName, methodName, null, null, encoder, decoder, null);
3537
}
3638

3739
public TranscodingServiceMethodImpl(ServiceName serviceName, String methodName, GrpcMessageEncoder<O> encoder, GrpcMessageDecoder<I> decoder, MethodTranscodingOptions options) {
40+
this(serviceName, methodName, null, null, encoder, decoder, options);
41+
}
42+
43+
public TranscodingServiceMethodImpl(ServiceName serviceName, String methodName, Boolean clientStreaming, Boolean serverStreaming, GrpcMessageEncoder<O> encoder, GrpcMessageDecoder<I> decoder, MethodTranscodingOptions options) {
3844
this.serviceName = serviceName;
3945
this.methodName = methodName;
46+
this.clientStreaming = clientStreaming;
47+
this.serverStreaming = serverStreaming;
4048
this.encoder = encoder;
4149
this.decoder = decoder;
4250
this.options = options;
@@ -118,6 +126,16 @@ public String methodName() {
118126
return methodName;
119127
}
120128

129+
@Override
130+
public Boolean clientStreaming() {
131+
return clientStreaming;
132+
}
133+
134+
@Override
135+
public Boolean serverStreaming() {
136+
return serverStreaming;
137+
}
138+
121139
@Override
122140
public GrpcMessageDecoder<I> decoder() {
123141
return decoder;

0 commit comments

Comments
 (0)