Skip to content
This repository was archived by the owner on Sep 26, 2023. It is now read-only.

Commit af0e4a9

Browse files
Moving param extraction to new callable + grpc settings (#387)
1 parent a76c129 commit af0e4a9

11 files changed

Lines changed: 240 additions & 210 deletions

gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcCallContext.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,13 @@ public GrpcCallContext withCallOptions(CallOptions newCallOptions) {
179179
return new GrpcCallContext(this.channel, newCallOptions);
180180
}
181181

182+
public GrpcCallContext withRequestParamsDynamicHeaderOption(String requestParams) {
183+
CallOptions newCallOptions =
184+
CallOptionsUtil.putRequestParamsDynamicHeaderOption(callOptions, requestParams);
185+
186+
return withCallOptions(newCallOptions);
187+
}
188+
182189
@Override
183190
public boolean equals(Object o) {
184191
if (this == o) {

gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcCallSettings.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,32 @@
2929
*/
3030
package com.google.api.gax.grpc;
3131

32+
import com.google.api.core.BetaApi;
33+
import com.google.api.gax.rpc.RequestParamsExtractor;
3234
import io.grpc.MethodDescriptor;
3335

3436
/** Grpc-specific settings for creating callables. */
37+
@BetaApi
3538
public class GrpcCallSettings<RequestT, ResponseT> {
3639
private final MethodDescriptor<RequestT, ResponseT> methodDescriptor;
40+
private final RequestParamsExtractor<RequestT> paramsExtractor;
3741

38-
private GrpcCallSettings(MethodDescriptor<RequestT, ResponseT> methodDescriptor) {
42+
private GrpcCallSettings(
43+
MethodDescriptor<RequestT, ResponseT> methodDescriptor,
44+
RequestParamsExtractor<RequestT> paramsExtractor) {
3945
this.methodDescriptor = methodDescriptor;
46+
this.paramsExtractor = paramsExtractor;
4047
}
4148

4249
public MethodDescriptor<RequestT, ResponseT> getMethodDescriptor() {
4350
return methodDescriptor;
4451
}
4552

53+
@BetaApi
54+
public RequestParamsExtractor<RequestT> getParamsExtractor() {
55+
return paramsExtractor;
56+
}
57+
4658
public static <RequestT, ResponseT> Builder<RequestT, ResponseT> newBuilder() {
4759
return new Builder<>();
4860
}
@@ -60,6 +72,7 @@ public Builder toBuilder() {
6072

6173
public static class Builder<RequestT, ResponseT> {
6274
private MethodDescriptor<RequestT, ResponseT> methodDescriptor;
75+
private RequestParamsExtractor<RequestT> paramsExtractor;
6376

6477
private Builder() {}
6578

@@ -73,8 +86,15 @@ public Builder<RequestT, ResponseT> setMethodDescriptor(
7386
return this;
7487
}
7588

89+
@BetaApi
90+
public Builder<RequestT, ResponseT> setParamsExtractor(
91+
RequestParamsExtractor<RequestT> paramsExtractor) {
92+
this.paramsExtractor = paramsExtractor;
93+
return this;
94+
}
95+
7696
public GrpcCallSettings<RequestT, ResponseT> build() {
77-
return new GrpcCallSettings<>(methodDescriptor);
97+
return new GrpcCallSettings<>(methodDescriptor, paramsExtractor);
7898
}
7999
}
80100
}

gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcCallableFactory.java

Lines changed: 18 additions & 174 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,11 @@
3636
import com.google.api.gax.rpc.CallableFactory;
3737
import com.google.api.gax.rpc.ClientContext;
3838
import com.google.api.gax.rpc.ClientStreamingCallable;
39-
import com.google.api.gax.rpc.EmptyRequestParamsExtractor;
4039
import com.google.api.gax.rpc.LongRunningClient;
4140
import com.google.api.gax.rpc.OperationCallSettings;
4241
import com.google.api.gax.rpc.OperationCallable;
4342
import com.google.api.gax.rpc.PagedCallSettings;
44-
import com.google.api.gax.rpc.RequestParamsExtractor;
45-
import com.google.api.gax.rpc.RequestUrlParamsEncoder;
4643
import com.google.api.gax.rpc.ServerStreamingCallable;
47-
import com.google.api.gax.rpc.SimpleCallSettings;
4844
import com.google.api.gax.rpc.StreamingCallSettings;
4945
import com.google.api.gax.rpc.UnaryCallSettings;
5046
import com.google.api.gax.rpc.UnaryCallSettingsTyped;
@@ -62,12 +58,13 @@ private GrpcCallableFactory() {}
6258
private static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createBaseUnaryCallable(
6359
GrpcCallSettings<RequestT, ResponseT> grpcCallSettings,
6460
UnaryCallSettings callSettings,
65-
ClientContext clientContext,
66-
RequestParamsExtractor<RequestT> paramsExtractor) {
61+
ClientContext clientContext) {
6762
UnaryCallable<RequestT, ResponseT> callable =
68-
new GrpcDirectCallable<>(
69-
grpcCallSettings.getMethodDescriptor(),
70-
new RequestUrlParamsEncoder<>(paramsExtractor, false));
63+
new GrpcDirectCallable<>(grpcCallSettings.getMethodDescriptor());
64+
if (grpcCallSettings.getParamsExtractor() != null) {
65+
callable =
66+
new GrpcUnaryRequestParamCallable<>(callable, grpcCallSettings.getParamsExtractor());
67+
}
7168
callable = new GrpcExceptionCallable<>(callable, callSettings.getRetryableCodes());
7269
callable = callableFactory.withRetry(callable, callSettings, clientContext);
7370
return callable;
@@ -77,38 +74,14 @@ private static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createBa
7774
* Create a callable object with grpc-specific functionality. Designed for use by generated code.
7875
*
7976
* @param grpcCallSettings the gRPC call settings
80-
* @param simpleCallSettings {@link SimpleCallSettings} to configure the method-level settings
81-
* with.
82-
* @param clientContext {@link ClientContext} to use to connect to the service.
83-
* @return {@link UnaryCallable} callable object.
84-
*/
85-
public static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createUnaryCallable(
86-
GrpcCallSettings<RequestT, ResponseT> grpcCallSettings,
87-
SimpleCallSettings<RequestT, ResponseT> simpleCallSettings,
88-
ClientContext clientContext) {
89-
return createUnaryCallable(
90-
grpcCallSettings,
91-
simpleCallSettings,
92-
clientContext,
93-
EmptyRequestParamsExtractor.<RequestT>of());
94-
}
95-
96-
/**
97-
* Create a callable object with grpc-specific functionality. Designed for use by generated code.
98-
*
99-
* @param grpcCallSettings the gRPC call settings
100-
* @param paramsExtractor request message parameters extractor, which will be used to populate
101-
* routing headers
10277
*/
10378
@BetaApi
10479
public static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createUnaryCallable(
10580
GrpcCallSettings<RequestT, ResponseT> grpcCallSettings,
10681
UnaryCallSettingsTyped<RequestT, ResponseT> simpleCallSettings,
107-
ClientContext clientContext,
108-
RequestParamsExtractor<RequestT> paramsExtractor) {
82+
ClientContext clientContext) {
10983
UnaryCallable<RequestT, ResponseT> callable =
110-
createBaseUnaryCallable(
111-
grpcCallSettings, simpleCallSettings, clientContext, paramsExtractor);
84+
createBaseUnaryCallable(grpcCallSettings, simpleCallSettings, clientContext);
11285
return callable.withDefaultCallContext(clientContext.getDefaultCallContext());
11386
}
11487

@@ -126,33 +99,8 @@ UnaryCallable<RequestT, ResponseT> createUnpagedCallable(
12699
GrpcCallSettings<RequestT, ResponseT> grpcCallSettings,
127100
PagedCallSettings<RequestT, ResponseT, PagedListResponseT> pagedCallSettings,
128101
ClientContext clientContext) {
129-
return createUnpagedCallable(
130-
grpcCallSettings,
131-
pagedCallSettings,
132-
clientContext,
133-
EmptyRequestParamsExtractor.<RequestT>of());
134-
}
135-
136-
/**
137-
* Create a callable object that represents a simple call to a paged API method. Designed for use
138-
* by generated code.
139-
*
140-
* @param grpcCallSettings the gRPC call settings
141-
* @param pagedCallSettings {@link PagedCallSettings} to configure the method-level settings with.
142-
* @param clientContext {@link ClientContext} to use to connect to the service.
143-
* @param paramsExtractor request message parameters extractor, which will be used to populate
144-
* routing headers
145-
* @return {@link UnaryCallable} callable object.
146-
*/
147-
public static <RequestT, ResponseT, PagedListResponseT>
148-
UnaryCallable<RequestT, ResponseT> createUnpagedCallable(
149-
GrpcCallSettings<RequestT, ResponseT> grpcCallSettings,
150-
PagedCallSettings<RequestT, ResponseT, PagedListResponseT> pagedCallSettings,
151-
ClientContext clientContext,
152-
RequestParamsExtractor<RequestT> paramsExtractor) {
153102
UnaryCallable<RequestT, ResponseT> callable =
154-
createBaseUnaryCallable(
155-
grpcCallSettings, pagedCallSettings, clientContext, paramsExtractor);
103+
createBaseUnaryCallable(grpcCallSettings, pagedCallSettings, clientContext);
156104
return callable.withDefaultCallContext(clientContext.getDefaultCallContext());
157105
}
158106

@@ -170,33 +118,8 @@ UnaryCallable<RequestT, PagedListResponseT> createPagedCallable(
170118
GrpcCallSettings<RequestT, ResponseT> grpcCallSettings,
171119
PagedCallSettings<RequestT, ResponseT, PagedListResponseT> pagedCallSettings,
172120
ClientContext clientContext) {
173-
return createPagedCallable(
174-
grpcCallSettings,
175-
pagedCallSettings,
176-
clientContext,
177-
EmptyRequestParamsExtractor.<RequestT>of());
178-
}
179-
180-
/**
181-
* Create a paged callable object that represents a paged API method. Designed for use by
182-
* generated code.
183-
*
184-
* @param grpcCallSettings the gRPC call settings
185-
* @param pagedCallSettings {@link PagedCallSettings} to configure the paged settings with.
186-
* @param clientContext {@link ClientContext} to use to connect to the service.
187-
* @param paramsExtractor request message parameters extractor, which will be used to populate
188-
* routing headers
189-
* @return {@link UnaryCallable} callable object.
190-
*/
191-
public static <RequestT, ResponseT, PagedListResponseT>
192-
UnaryCallable<RequestT, PagedListResponseT> createPagedCallable(
193-
GrpcCallSettings<RequestT, ResponseT> grpcCallSettings,
194-
PagedCallSettings<RequestT, ResponseT, PagedListResponseT> pagedCallSettings,
195-
ClientContext clientContext,
196-
RequestParamsExtractor<RequestT> paramsExtractor) {
197121
UnaryCallable<RequestT, ResponseT> innerCallable =
198-
createBaseUnaryCallable(
199-
grpcCallSettings, pagedCallSettings, clientContext, paramsExtractor);
122+
createBaseUnaryCallable(grpcCallSettings, pagedCallSettings, clientContext);
200123
UnaryCallable<RequestT, PagedListResponseT> pagedCallable =
201124
callableFactory.asPagedVariant(innerCallable, pagedCallSettings);
202125
return pagedCallable.withDefaultCallContext(clientContext.getDefaultCallContext());
@@ -216,33 +139,8 @@ public static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createBat
216139
GrpcCallSettings<RequestT, ResponseT> grpcCallSettings,
217140
BatchingCallSettings<RequestT, ResponseT> batchingCallSettings,
218141
ClientContext clientContext) {
219-
return createBatchingCallable(
220-
grpcCallSettings,
221-
batchingCallSettings,
222-
clientContext,
223-
EmptyRequestParamsExtractor.<RequestT>of());
224-
}
225-
226-
/**
227-
* Create a callable object that represents a batching API method. Designed for use by generated
228-
* code.
229-
*
230-
* @param grpcCallSettings the gRPC call settings
231-
* @param batchingCallSettings {@link BatchingCallSettings} to configure the batching related
232-
* settings with.
233-
* @param clientContext {@link ClientContext} to use to connect to the service.
234-
* @param paramsExtractor request message parameters extractor, which will be used to populate
235-
* routing headers
236-
* @return {@link UnaryCallable} callable object.
237-
*/
238-
public static <RequestT, ResponseT> UnaryCallable<RequestT, ResponseT> createBatchingCallable(
239-
GrpcCallSettings<RequestT, ResponseT> grpcCallSettings,
240-
BatchingCallSettings<RequestT, ResponseT> batchingCallSettings,
241-
ClientContext clientContext,
242-
RequestParamsExtractor<RequestT> paramsExtractor) {
243142
UnaryCallable<RequestT, ResponseT> callable =
244-
createBaseUnaryCallable(
245-
grpcCallSettings, batchingCallSettings, clientContext, paramsExtractor);
143+
createBaseUnaryCallable(grpcCallSettings, batchingCallSettings, clientContext);
246144
callable = callableFactory.withBatching(callable, batchingCallSettings, clientContext);
247145
return callable.withDefaultCallContext(clientContext.getDefaultCallContext());
248146
}
@@ -264,40 +162,9 @@ OperationCallable<RequestT, ResponseT, MetadataT> createOperationCallable(
264162
OperationCallSettings<RequestT, ResponseT, MetadataT> operationCallSettings,
265163
ClientContext clientContext,
266164
OperationsStub operationsStub) {
267-
return createOperationCallable(
268-
grpcCallSettings,
269-
operationCallSettings,
270-
clientContext,
271-
operationsStub,
272-
EmptyRequestParamsExtractor.<RequestT>of());
273-
}
274-
275-
/**
276-
* Creates a callable object that represents a long-running operation. Designed for use by
277-
* generated code.
278-
*
279-
* @param grpcCallSettings the gRPC call settings
280-
* @param operationCallSettings {@link OperationCallSettings} to configure the method-level
281-
* settings with.
282-
* @param clientContext {@link ClientContext} to use to connect to the service.
283-
* @param operationsStub {@link OperationsStub} to use to poll for updates on the Operation.
284-
* @param paramsExtractor request message parameters extractor, which will be used to populate
285-
* routing headers
286-
* @return {@link com.google.api.gax.rpc.OperationCallable} callable object.
287-
*/
288-
public static <RequestT, ResponseT, MetadataT>
289-
OperationCallable<RequestT, ResponseT, MetadataT> createOperationCallable(
290-
GrpcCallSettings<RequestT, Operation> grpcCallSettings,
291-
OperationCallSettings<RequestT, ResponseT, MetadataT> operationCallSettings,
292-
ClientContext clientContext,
293-
OperationsStub operationsStub,
294-
RequestParamsExtractor<RequestT> paramsExtractor) {
295165
UnaryCallable<RequestT, Operation> initialGrpcCallable =
296166
createBaseUnaryCallable(
297-
grpcCallSettings,
298-
operationCallSettings.getInitialCallSettings(),
299-
clientContext,
300-
paramsExtractor);
167+
grpcCallSettings, operationCallSettings.getInitialCallSettings(), clientContext);
301168
UnaryCallable<RequestT, OperationSnapshot> initialCallable =
302169
new GrpcOperationSnapshotCallable<>(initialGrpcCallable);
303170
LongRunningClient longRunningClient = new GrpcLongRunningClient(operationsStub);
@@ -336,43 +203,20 @@ BidiStreamingCallable<RequestT, ResponseT> createBidiStreamingCallable(
336203
* @param streamingCallSettings {@link StreamingCallSettings} to configure the method-level
337204
* settings with.
338205
* @param clientContext {@link ClientContext} to use to connect to the service.
339-
* @return {@link ServerStreamingCallable} callable object.
340206
*/
341207
@BetaApi
342208
public static <RequestT, ResponseT>
343209
ServerStreamingCallable<RequestT, ResponseT> createServerStreamingCallable(
344210
GrpcCallSettings<RequestT, ResponseT> grpcCallSettings,
345211
StreamingCallSettings<RequestT, ResponseT> streamingCallSettings,
346212
ClientContext clientContext) {
347-
return createServerStreamingCallable(
348-
grpcCallSettings,
349-
streamingCallSettings,
350-
clientContext,
351-
EmptyRequestParamsExtractor.<RequestT>of());
352-
}
353-
354-
/**
355-
* Create a server-streaming callable with grpc-specific functionality. Designed for use by
356-
* generated code.
357-
*
358-
* @param grpcCallSettings the gRPC call settings
359-
* @param streamingCallSettings {@link StreamingCallSettings} to configure the method-level
360-
* settings with.
361-
* @param clientContext {@link ClientContext} to use to connect to the service.
362-
* @param paramsExtractor request message parameters extractor, which will be used to populate
363-
* routing headers
364-
*/
365-
@BetaApi
366-
public static <RequestT, ResponseT>
367-
ServerStreamingCallable<RequestT, ResponseT> createServerStreamingCallable(
368-
GrpcCallSettings<RequestT, ResponseT> grpcCallSettings,
369-
StreamingCallSettings<RequestT, ResponseT> streamingCallSettings,
370-
ClientContext clientContext,
371-
RequestParamsExtractor<RequestT> paramsExtractor) {
372213
ServerStreamingCallable<RequestT, ResponseT> callable =
373-
new GrpcDirectServerStreamingCallable<>(
374-
grpcCallSettings.getMethodDescriptor(),
375-
new RequestUrlParamsEncoder<>(paramsExtractor, false));
214+
new GrpcDirectServerStreamingCallable<>(grpcCallSettings.getMethodDescriptor());
215+
if (grpcCallSettings.getParamsExtractor() != null) {
216+
callable =
217+
new GrpcServerStreamingRequestParamCallable<>(
218+
callable, grpcCallSettings.getParamsExtractor());
219+
}
376220
return callable.withDefaultCallContext(clientContext.getDefaultCallContext());
377221
}
378222

gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcClientCalls.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131

3232
import com.google.api.client.util.Preconditions;
3333
import com.google.api.gax.rpc.ApiCallContext;
34-
import com.google.api.gax.rpc.RequestParamsEncoder;
3534
import io.grpc.CallOptions;
3635
import io.grpc.ClientCall;
3736
import io.grpc.MethodDescriptor;
@@ -45,10 +44,7 @@ class GrpcClientCalls {
4544
private GrpcClientCalls() {};
4645

4746
public static <RequestT, ResponseT> ClientCall<RequestT, ResponseT> newCall(
48-
MethodDescriptor<RequestT, ResponseT> descriptor,
49-
ApiCallContext context,
50-
RequestT request,
51-
RequestParamsEncoder<RequestT> paramsEncoder) {
47+
MethodDescriptor<RequestT, ResponseT> descriptor, ApiCallContext context) {
5248
if (!(context instanceof GrpcCallContext)) {
5349
throw new IllegalArgumentException(
5450
"context must be an instance of GrpcCallContext, but found "
@@ -61,12 +57,6 @@ public static <RequestT, ResponseT> ClientCall<RequestT, ResponseT> newCall(
6157
CallOptions callOptions = grpcContext.getCallOptions();
6258
Preconditions.checkNotNull(callOptions);
6359

64-
if (paramsEncoder != null) {
65-
callOptions =
66-
CallOptionsUtil.putRequestParamsDynamicHeaderOption(
67-
callOptions, paramsEncoder.encode(request));
68-
}
69-
7060
return grpcContext.getChannel().newCall(descriptor, callOptions);
7161
}
7262
}

gax-grpc/src/main/java/com/google/api/gax/grpc/GrpcDirectBidiStreamingCallable.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class GrpcDirectBidiStreamingCallable<RequestT, ResponseT>
5656
public ApiStreamObserver<RequestT> bidiStreamingCall(
5757
ApiStreamObserver<ResponseT> responseObserver, ApiCallContext context) {
5858
Preconditions.checkNotNull(responseObserver);
59-
ClientCall<RequestT, ResponseT> call = GrpcClientCalls.newCall(descriptor, context, null, null);
59+
ClientCall<RequestT, ResponseT> call = GrpcClientCalls.newCall(descriptor, context);
6060
return new StreamObserverDelegate<>(
6161
ClientCalls.asyncBidiStreamingCall(
6262
call, new ApiStreamObserverDelegate<>(responseObserver)));

0 commit comments

Comments
 (0)