Skip to content

Commit 3b2dec6

Browse files
authored
feat: add server streaming support for REST transport (#902)
This PR depends on googleapis/gax-java#1599
1 parent 128039b commit 3b2dec6

11 files changed

+111
-23
lines changed

WORKSPACE

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ jvm_maven_import_external(
3333
# which in its turn, prioritizes actual generated clients runtime dependencies
3434
# over the generator dependencies.
3535

36-
_gax_java_version = "2.7.1"
36+
_gax_java_version = "2.10.0"
3737

3838
http_archive(
3939
name = "com_google_api_gax_java",

src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceCallableFactoryClassComposer.java

+22
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,28 @@ protected MethodDefinition createBatchingCallableMethod(Service service, TypeSto
189189
protected abstract MethodDefinition createOperationCallableMethod(
190190
Service service, TypeStore typeStore);
191191

192+
protected MethodDefinition createServerStreamingCallableMethod(
193+
Service service, TypeStore typeStore) {
194+
String methodVariantName = "ServerStreaming";
195+
String requestTemplateName = "RequestT";
196+
String responseTemplateName = "ResponseT";
197+
List<String> methodTemplateNames = Arrays.asList(requestTemplateName, responseTemplateName);
198+
return createGenericCallableMethod(
199+
service,
200+
typeStore,
201+
/*methodTemplateNames=*/ methodTemplateNames,
202+
/*returnCallableKindName=*/ methodVariantName,
203+
/*returnCallableTemplateNames=*/ methodTemplateNames,
204+
/*methodVariantName=*/ methodVariantName,
205+
/*grpcCallSettingsTemplateObjects=*/ methodTemplateNames.stream()
206+
.map(n -> (Object) n)
207+
.collect(Collectors.toList()),
208+
/*callSettingsVariantName=*/ methodVariantName,
209+
/*callSettingsTemplateObjects=*/ methodTemplateNames.stream()
210+
.map(n -> (Object) n)
211+
.collect(Collectors.toList()));
212+
}
213+
192214
protected MethodDefinition createGenericCallableMethod(
193215
Service service,
194216
TypeStore typeStore,

src/main/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceCallableFactoryClassComposer.java

-22
Original file line numberDiff line numberDiff line change
@@ -146,28 +146,6 @@ private MethodDefinition createBidiStreamingCallableMethod(Service service, Type
146146
.collect(Collectors.toList()));
147147
}
148148

149-
private MethodDefinition createServerStreamingCallableMethod(
150-
Service service, TypeStore typeStore) {
151-
String methodVariantName = "ServerStreaming";
152-
String requestTemplateName = "RequestT";
153-
String responseTemplateName = "ResponseT";
154-
List<String> methodTemplateNames = Arrays.asList(requestTemplateName, responseTemplateName);
155-
return createGenericCallableMethod(
156-
service,
157-
typeStore,
158-
/*methodTemplateNames=*/ methodTemplateNames,
159-
/*returnCallableKindName=*/ methodVariantName,
160-
/*returnCallableTemplateNames=*/ methodTemplateNames,
161-
/*methodVariantName=*/ methodVariantName,
162-
/*grpcCallSettingsTemplateObjects=*/ methodTemplateNames.stream()
163-
.map(n -> (Object) n)
164-
.collect(Collectors.toList()),
165-
/*callSettingsVariantName=*/ methodVariantName,
166-
/*callSettingsTemplateObjects=*/ methodTemplateNames.stream()
167-
.map(n -> (Object) n)
168-
.collect(Collectors.toList()));
169-
}
170-
171149
private MethodDefinition createClientStreamingCallableMethod(
172150
Service service, TypeStore typeStore) {
173151
String methodVariantName = "ClientStreaming";

src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceCallableFactoryClassComposer.java

+8
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@ protected List<TypeNode> createClassImplements(Service service, TypeStore typeSt
8787
Arrays.asList(operationType.reference(), operationsStubType.reference()))));
8888
}
8989

90+
@Override
91+
protected List<MethodDefinition> createClassMethods(Service service, TypeStore typeStore) {
92+
List<MethodDefinition> classMethods =
93+
new ArrayList<>(super.createClassMethods(service, typeStore));
94+
classMethods.addAll(Arrays.asList(createServerStreamingCallableMethod(service, typeStore)));
95+
return classMethods;
96+
}
97+
9098
@Override
9199
protected MethodDefinition createOperationCallableMethod(Service service, TypeStore typeStore) {
92100
String methodVariantName = "Operation";

src/main/java/com/google/api/generator/gapic/composer/rest/HttpJsonServiceStubClassComposer.java

+32
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.google.api.client.http.HttpMethods;
1818
import com.google.api.core.InternalApi;
1919
import com.google.api.gax.httpjson.ApiMethodDescriptor;
20+
import com.google.api.gax.httpjson.ApiMethodDescriptor.MethodType;
2021
import com.google.api.gax.httpjson.FieldsExtractor;
2122
import com.google.api.gax.httpjson.HttpJsonCallSettings;
2223
import com.google.api.gax.httpjson.HttpJsonLongRunningClient;
@@ -143,6 +144,7 @@ protected Statement createMethodDescriptorVariableDecl(
143144
.apply(expr);
144145

145146
expr = methodMaker.apply("setHttpMethod", getHttpMethodTypeExpr(protoMethod)).apply(expr);
147+
expr = methodMaker.apply("setType", getMethodTypeExpr(protoMethod)).apply(expr);
146148
expr =
147149
methodMaker.apply("setRequestFormatter", getRequestFormatterExpr(protoMethod)).apply(expr);
148150
expr = methodMaker.apply("setResponseParser", setResponseParserExpr(protoMethod)).apply(expr);
@@ -977,6 +979,36 @@ private List<Expr> getHttpMethodTypeExpr(Method protoMethod) {
977979
return Collections.singletonList(expr);
978980
}
979981

982+
private List<Expr> getMethodTypeExpr(Method protoMethod) {
983+
MethodType methodType;
984+
switch (protoMethod.stream()) {
985+
case NONE:
986+
methodType = MethodType.UNARY;
987+
break;
988+
case SERVER:
989+
methodType = MethodType.SERVER_STREAMING;
990+
break;
991+
case CLIENT:
992+
// Not feasible to suppor in REST
993+
case BIDI:
994+
// Not feasible to suppor in REST
995+
default:
996+
throw new UnsupportedOperationException(
997+
String.format(
998+
"Methods of type %s are not supported by REST transport", protoMethod.stream()));
999+
}
1000+
EnumRefExpr expr =
1001+
EnumRefExpr.builder()
1002+
.setName(methodType.toString())
1003+
.setType(
1004+
TypeNode.withReference(
1005+
ConcreteReference.builder()
1006+
.setClazz(ApiMethodDescriptor.MethodType.class)
1007+
.build()))
1008+
.build();
1009+
return Collections.singletonList(expr);
1010+
}
1011+
9801012
@Override
9811013
protected List<Expr> createOperationsStubInitExpr(
9821014
Service service,

src/test/java/com/google/api/generator/gapic/composer/rest/goldens/HttpJsonComplianceCallableFactory.golden

+12
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import com.google.api.gax.rpc.ClientContext;
1111
import com.google.api.gax.rpc.OperationCallSettings;
1212
import com.google.api.gax.rpc.OperationCallable;
1313
import com.google.api.gax.rpc.PagedCallSettings;
14+
import com.google.api.gax.rpc.ServerStreamingCallSettings;
15+
import com.google.api.gax.rpc.ServerStreamingCallable;
1416
import com.google.api.gax.rpc.UnaryCallSettings;
1517
import com.google.api.gax.rpc.UnaryCallable;
1618
import com.google.longrunning.Operation;
@@ -74,4 +76,14 @@ public class HttpJsonComplianceCallableFactory
7476
return HttpJsonCallableFactory.createOperationCallable(
7577
callSettings, clientContext, operationsStub.longRunningClient(), initialCallable);
7678
}
79+
80+
@Override
81+
public <RequestT, ResponseT>
82+
ServerStreamingCallable<RequestT, ResponseT> createServerStreamingCallable(
83+
HttpJsonCallSettings<RequestT, ResponseT> httpJsonCallSettings,
84+
ServerStreamingCallSettings<RequestT, ResponseT> callSettings,
85+
ClientContext clientContext) {
86+
return HttpJsonCallableFactory.createServerStreamingCallable(
87+
httpJsonCallSettings, callSettings, clientContext);
88+
}
7789
}

src/test/java/com/google/api/generator/gapic/composer/rest/goldens/HttpJsonComplianceStub.golden

+6
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public class HttpJsonComplianceStub extends ComplianceStub {
4141
ApiMethodDescriptor.<RepeatRequest, RepeatResponse>newBuilder()
4242
.setFullMethodName("google.showcase.v1beta1.Compliance/RepeatDataBody")
4343
.setHttpMethod(HttpMethods.POST)
44+
.setType(ApiMethodDescriptor.MethodType.UNARY)
4445
.setRequestFormatter(
4546
ProtoMessageRequestFormatter.<RepeatRequest>newBuilder()
4647
.setPath(
@@ -74,6 +75,7 @@ public class HttpJsonComplianceStub extends ComplianceStub {
7475
ApiMethodDescriptor.<RepeatRequest, RepeatResponse>newBuilder()
7576
.setFullMethodName("google.showcase.v1beta1.Compliance/RepeatDataBodyInfo")
7677
.setHttpMethod(HttpMethods.POST)
78+
.setType(ApiMethodDescriptor.MethodType.UNARY)
7779
.setRequestFormatter(
7880
ProtoMessageRequestFormatter.<RepeatRequest>newBuilder()
7981
.setPath(
@@ -109,6 +111,7 @@ public class HttpJsonComplianceStub extends ComplianceStub {
109111
ApiMethodDescriptor.<RepeatRequest, RepeatResponse>newBuilder()
110112
.setFullMethodName("google.showcase.v1beta1.Compliance/RepeatDataQuery")
111113
.setHttpMethod(HttpMethods.GET)
114+
.setType(ApiMethodDescriptor.MethodType.UNARY)
112115
.setRequestFormatter(
113116
ProtoMessageRequestFormatter.<RepeatRequest>newBuilder()
114117
.setPath(
@@ -144,6 +147,7 @@ public class HttpJsonComplianceStub extends ComplianceStub {
144147
ApiMethodDescriptor.<RepeatRequest, RepeatResponse>newBuilder()
145148
.setFullMethodName("google.showcase.v1beta1.Compliance/RepeatDataSimplePath")
146149
.setHttpMethod(HttpMethods.GET)
150+
.setType(ApiMethodDescriptor.MethodType.UNARY)
147151
.setRequestFormatter(
148152
ProtoMessageRequestFormatter.<RepeatRequest>newBuilder()
149153
.setPath(
@@ -191,6 +195,7 @@ public class HttpJsonComplianceStub extends ComplianceStub {
191195
ApiMethodDescriptor.<RepeatRequest, RepeatResponse>newBuilder()
192196
.setFullMethodName("google.showcase.v1beta1.Compliance/RepeatDataPathResource")
193197
.setHttpMethod(HttpMethods.GET)
198+
.setType(ApiMethodDescriptor.MethodType.UNARY)
194199
.setRequestFormatter(
195200
ProtoMessageRequestFormatter.<RepeatRequest>newBuilder()
196201
.setPath(
@@ -237,6 +242,7 @@ public class HttpJsonComplianceStub extends ComplianceStub {
237242
.setFullMethodName(
238243
"google.showcase.v1beta1.Compliance/RepeatDataPathTrailingResource")
239244
.setHttpMethod(HttpMethods.GET)
245+
.setType(ApiMethodDescriptor.MethodType.UNARY)
240246
.setRequestFormatter(
241247
ProtoMessageRequestFormatter.<RepeatRequest>newBuilder()
242248
.setPath(

test/integration/goldens/compute/com/google/cloud/compute/v1/stub/HttpJsonAddressesCallableFactory.java

+12
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import com.google.api.gax.rpc.OperationCallSettings;
2727
import com.google.api.gax.rpc.OperationCallable;
2828
import com.google.api.gax.rpc.PagedCallSettings;
29+
import com.google.api.gax.rpc.ServerStreamingCallSettings;
30+
import com.google.api.gax.rpc.ServerStreamingCallable;
2931
import com.google.api.gax.rpc.UnaryCallSettings;
3032
import com.google.api.gax.rpc.UnaryCallable;
3133
import com.google.cloud.compute.v1.Operation;
@@ -89,4 +91,14 @@ OperationCallable<RequestT, ResponseT, MetadataT> createOperationCallable(
8991
return HttpJsonCallableFactory.createOperationCallable(
9092
callSettings, clientContext, operationsStub.longRunningClient(), initialCallable);
9193
}
94+
95+
@Override
96+
public <RequestT, ResponseT>
97+
ServerStreamingCallable<RequestT, ResponseT> createServerStreamingCallable(
98+
HttpJsonCallSettings<RequestT, ResponseT> httpJsonCallSettings,
99+
ServerStreamingCallSettings<RequestT, ResponseT> callSettings,
100+
ClientContext clientContext) {
101+
return HttpJsonCallableFactory.createServerStreamingCallable(
102+
httpJsonCallSettings, callSettings, clientContext);
103+
}
92104
}

test/integration/goldens/compute/com/google/cloud/compute/v1/stub/HttpJsonAddressesStub.java

+4
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public class HttpJsonAddressesStub extends AddressesStub {
6969
ApiMethodDescriptor.<AggregatedListAddressesRequest, AddressAggregatedList>newBuilder()
7070
.setFullMethodName("google.cloud.compute.v1.Addresses/AggregatedList")
7171
.setHttpMethod(HttpMethods.GET)
72+
.setType(ApiMethodDescriptor.MethodType.UNARY)
7273
.setRequestFormatter(
7374
ProtoMessageRequestFormatter.<AggregatedListAddressesRequest>newBuilder()
7475
.setPath(
@@ -117,6 +118,7 @@ public class HttpJsonAddressesStub extends AddressesStub {
117118
ApiMethodDescriptor.<DeleteAddressRequest, Operation>newBuilder()
118119
.setFullMethodName("google.cloud.compute.v1.Addresses/Delete")
119120
.setHttpMethod(HttpMethods.DELETE)
121+
.setType(ApiMethodDescriptor.MethodType.UNARY)
120122
.setRequestFormatter(
121123
ProtoMessageRequestFormatter.<DeleteAddressRequest>newBuilder()
122124
.setPath(
@@ -166,6 +168,7 @@ public class HttpJsonAddressesStub extends AddressesStub {
166168
ApiMethodDescriptor.<InsertAddressRequest, Operation>newBuilder()
167169
.setFullMethodName("google.cloud.compute.v1.Addresses/Insert")
168170
.setHttpMethod(HttpMethods.POST)
171+
.setType(ApiMethodDescriptor.MethodType.UNARY)
169172
.setRequestFormatter(
170173
ProtoMessageRequestFormatter.<InsertAddressRequest>newBuilder()
171174
.setPath(
@@ -217,6 +220,7 @@ public class HttpJsonAddressesStub extends AddressesStub {
217220
ApiMethodDescriptor.<ListAddressesRequest, AddressList>newBuilder()
218221
.setFullMethodName("google.cloud.compute.v1.Addresses/List")
219222
.setHttpMethod(HttpMethods.GET)
223+
.setType(ApiMethodDescriptor.MethodType.UNARY)
220224
.setRequestFormatter(
221225
ProtoMessageRequestFormatter.<ListAddressesRequest>newBuilder()
222226
.setPath(

test/integration/goldens/compute/com/google/cloud/compute/v1/stub/HttpJsonRegionOperationsCallableFactory.java

+12
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import com.google.api.gax.rpc.OperationCallSettings;
2828
import com.google.api.gax.rpc.OperationCallable;
2929
import com.google.api.gax.rpc.PagedCallSettings;
30+
import com.google.api.gax.rpc.ServerStreamingCallSettings;
31+
import com.google.api.gax.rpc.ServerStreamingCallable;
3032
import com.google.api.gax.rpc.UnaryCallSettings;
3133
import com.google.api.gax.rpc.UnaryCallable;
3234
import com.google.longrunning.Operation;
@@ -90,4 +92,14 @@ OperationCallable<RequestT, ResponseT, MetadataT> createOperationCallable(
9092
return HttpJsonCallableFactory.createOperationCallable(
9193
callSettings, clientContext, operationsStub.longRunningClient(), initialCallable);
9294
}
95+
96+
@Override
97+
public <RequestT, ResponseT>
98+
ServerStreamingCallable<RequestT, ResponseT> createServerStreamingCallable(
99+
HttpJsonCallSettings<RequestT, ResponseT> httpJsonCallSettings,
100+
ServerStreamingCallSettings<RequestT, ResponseT> callSettings,
101+
ClientContext clientContext) {
102+
return HttpJsonCallableFactory.createServerStreamingCallable(
103+
httpJsonCallSettings, callSettings, clientContext);
104+
}
93105
}

test/integration/goldens/compute/com/google/cloud/compute/v1/stub/HttpJsonRegionOperationsStub.java

+2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public class HttpJsonRegionOperationsStub extends RegionOperationsStub {
6363
ApiMethodDescriptor.<GetRegionOperationRequest, Operation>newBuilder()
6464
.setFullMethodName("google.cloud.compute.v1.RegionOperations/Get")
6565
.setHttpMethod(HttpMethods.GET)
66+
.setType(ApiMethodDescriptor.MethodType.UNARY)
6667
.setRequestFormatter(
6768
ProtoMessageRequestFormatter.<GetRegionOperationRequest>newBuilder()
6869
.setPath(
@@ -117,6 +118,7 @@ public class HttpJsonRegionOperationsStub extends RegionOperationsStub {
117118
ApiMethodDescriptor.<WaitRegionOperationRequest, Operation>newBuilder()
118119
.setFullMethodName("google.cloud.compute.v1.RegionOperations/Wait")
119120
.setHttpMethod(HttpMethods.POST)
121+
.setType(ApiMethodDescriptor.MethodType.UNARY)
120122
.setRequestFormatter(
121123
ProtoMessageRequestFormatter.<WaitRegionOperationRequest>newBuilder()
122124
.setPath(

0 commit comments

Comments
 (0)