16
16
17
17
import com .google .api .gax .core .FixedCredentialsProvider ;
18
18
import com .google .api .generator .engine .ast .AssignmentExpr ;
19
+ import com .google .api .generator .engine .ast .CommentStatement ;
19
20
import com .google .api .generator .engine .ast .ConcreteReference ;
20
21
import com .google .api .generator .engine .ast .Expr ;
21
22
import com .google .api .generator .engine .ast .ExprStatement ;
23
+ import com .google .api .generator .engine .ast .ForStatement ;
24
+ import com .google .api .generator .engine .ast .LineComment ;
22
25
import com .google .api .generator .engine .ast .MethodInvocationExpr ;
26
+ import com .google .api .generator .engine .ast .Statement ;
23
27
import com .google .api .generator .engine .ast .TryCatchStatement ;
24
28
import com .google .api .generator .engine .ast .TypeNode ;
25
29
import com .google .api .generator .engine .ast .VaporReference ;
26
30
import com .google .api .generator .engine .ast .Variable ;
27
31
import com .google .api .generator .engine .ast .VariableExpr ;
28
32
import com .google .api .generator .gapic .composer .samplecode .SampleCodeWriter ;
33
+ import com .google .api .generator .gapic .model .Field ;
34
+ import com .google .api .generator .gapic .model .Message ;
29
35
import com .google .api .generator .gapic .model .Method ;
30
36
import com .google .api .generator .gapic .model .MethodArgument ;
31
37
import com .google .api .generator .gapic .model .ResourceName ;
32
38
import com .google .api .generator .gapic .utils .JavaStyle ;
33
39
import com .google .common .annotations .VisibleForTesting ;
34
40
import com .google .common .base .Preconditions ;
35
- import java .util .ArrayList ;
36
41
import java .util .Arrays ;
37
42
import java .util .List ;
38
43
import java .util .Map ;
44
+ import java .util .function .Function ;
39
45
import java .util .stream .Collectors ;
40
46
import java .util .stream .IntStream ;
41
47
@@ -186,8 +192,24 @@ public static String composeRpcMethodHeaderSampleCode(
186
192
Method method ,
187
193
TypeNode clientType ,
188
194
List <MethodArgument > arguments ,
189
- Map <String , ResourceName > resourceNames ) {
195
+ Map <String , ResourceName > resourceNames ,
196
+ Map <String , Message > messageTypes ) {
190
197
// TODO(summerji): Add other types RPC methods' sample code.
198
+ if (method .isPaged ()) {
199
+ // Find the repeated field.
200
+ Message methodOutputMessage = messageTypes .get (method .outputType ().reference ().simpleName ());
201
+ Field repeatedPagedResultsField = methodOutputMessage .findAndUnwrapFirstRepeatedField ();
202
+ Preconditions .checkNotNull (
203
+ repeatedPagedResultsField ,
204
+ String .format (
205
+ "No repeated field found on message %s for method %s" ,
206
+ methodOutputMessage .name (), method .name ()));
207
+
208
+ TypeNode repeatedResponseType = repeatedPagedResultsField .type ();
209
+ return SampleCodeWriter .write (
210
+ composeUnaryPagedRpcMethodSampleCode (
211
+ method , clientType , repeatedResponseType , arguments , resourceNames ));
212
+ }
191
213
return SampleCodeWriter .write (
192
214
composeUnaryRpcMethodSampleCode (method , clientType , arguments , resourceNames ));
193
215
}
@@ -204,52 +226,12 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode(
204
226
.setName (JavaStyle .toLowerCamelCase (clientType .reference ().name ()))
205
227
.setType (clientType )
206
228
.build ());
207
- // List of rpc method arguments' variable expressions.
208
- List <VariableExpr > rpcMethodArgVarExprs =
209
- arguments .stream ()
210
- .map (
211
- arg ->
212
- VariableExpr .withVariable (
213
- Variable .builder ()
214
- .setName (JavaStyle .toLowerCamelCase (arg .name ()))
215
- .setType (arg .type ())
216
- .build ()))
217
- .collect (Collectors .toList ());
218
- // List of rpc method arguments' default value expression.
219
- List <ResourceName > resourceNameList =
220
- resourceNames .values ().stream ().collect (Collectors .toList ());
229
+ List <VariableExpr > rpcMethodArgVarExprs = createRpcMethodArgumentVariableExprs (arguments );
221
230
List <Expr > rpcMethodArgDefaultValueExprs =
222
- arguments .stream ()
223
- .map (
224
- arg ->
225
- !isStringTypedResourceName (arg , resourceNames )
226
- ? DefaultValueComposer .createDefaultValue (arg , resourceNames )
227
- : MethodInvocationExpr .builder ()
228
- .setExprReferenceExpr (
229
- DefaultValueComposer .createDefaultValue (
230
- resourceNames .get (
231
- arg .field ().resourceReference ().resourceTypeString ()),
232
- resourceNameList ,
233
- arg .field ().name ()))
234
- .setMethodName ("toString" )
235
- .setReturnType (TypeNode .STRING )
236
- .build ())
237
- .collect (Collectors .toList ());
238
-
239
- List <Expr > bodyExprs = new ArrayList <>();
240
- Preconditions .checkState (
241
- rpcMethodArgVarExprs .size () == rpcMethodArgDefaultValueExprs .size (),
242
- "Expected the number of method arguments to match the number of default values." );
243
- bodyExprs .addAll (
244
- IntStream .range (0 , rpcMethodArgVarExprs .size ())
245
- .mapToObj (
246
- i ->
247
- AssignmentExpr .builder ()
248
- .setVariableExpr (
249
- (rpcMethodArgVarExprs .get (i )).toBuilder ().setIsDecl (true ).build ())
250
- .setValueExpr (rpcMethodArgDefaultValueExprs .get (i ))
251
- .build ())
252
- .collect (Collectors .toList ()));
231
+ createRpcMethodArgumentDefaultValueExprs (arguments , resourceNames );
232
+ List <Expr > bodyExprs =
233
+ createAssignmentsForVarExprsWithValueExprs (
234
+ rpcMethodArgVarExprs , rpcMethodArgDefaultValueExprs );
253
235
// Invoke current method based on return type.
254
236
// e.g. if return void, echoClient.echo(..); or,
255
237
// e.g. if return other type, EchoResponse response = echoClient.echo(...);
@@ -290,8 +272,125 @@ static TryCatchStatement composeUnaryRpcMethodSampleCode(
290
272
.build ();
291
273
}
292
274
275
+ @ VisibleForTesting
276
+ static TryCatchStatement composeUnaryPagedRpcMethodSampleCode (
277
+ Method method ,
278
+ TypeNode clientType ,
279
+ TypeNode repeatedResponseType ,
280
+ List <MethodArgument > arguments ,
281
+ Map <String , ResourceName > resourceNames ) {
282
+ VariableExpr clientVarExpr =
283
+ VariableExpr .withVariable (
284
+ Variable .builder ()
285
+ .setName (JavaStyle .toLowerCamelCase (clientType .reference ().name ()))
286
+ .setType (clientType )
287
+ .build ());
288
+ List <VariableExpr > rpcMethodArgVarExprs = createRpcMethodArgumentVariableExprs (arguments );
289
+ List <Expr > rpcMethodArgDefaultValueExprs =
290
+ createRpcMethodArgumentDefaultValueExprs (arguments , resourceNames );
291
+ List <Expr > bodyExprs =
292
+ createAssignmentsForVarExprsWithValueExprs (
293
+ rpcMethodArgVarExprs , rpcMethodArgDefaultValueExprs );
294
+ // For loop paged response item on iterateAll method.
295
+ // e.g. for (LogEntry element : loggingServiceV2Client.ListLogs(parent).iterateAll()) {
296
+ // //doThingsWith(element);
297
+ // }
298
+ MethodInvocationExpr clientMethodExpr =
299
+ MethodInvocationExpr .builder ()
300
+ .setExprReferenceExpr (clientVarExpr )
301
+ .setMethodName (JavaStyle .toLowerCamelCase (method .name ()))
302
+ .setArguments (
303
+ rpcMethodArgVarExprs .stream ().map (e -> (Expr ) e ).collect (Collectors .toList ()))
304
+ .build ();
305
+ Expr clientMethodIteratorAllExpr =
306
+ MethodInvocationExpr .builder ()
307
+ .setExprReferenceExpr (clientMethodExpr )
308
+ .setMethodName ("iterateAll" )
309
+ .setReturnType (repeatedResponseType )
310
+ .build ();
311
+ ForStatement loopIteratorStatement =
312
+ ForStatement .builder ()
313
+ .setLocalVariableExpr (
314
+ VariableExpr .builder ()
315
+ .setVariable (
316
+ Variable .builder ().setName ("element" ).setType (repeatedResponseType ).build ())
317
+ .setIsDecl (true )
318
+ .build ())
319
+ .setCollectionExpr (clientMethodIteratorAllExpr )
320
+ .setBody (
321
+ Arrays .asList (
322
+ CommentStatement .withComment (
323
+ LineComment .withComment ("doThingsWith(element);" ))))
324
+ .build ();
325
+
326
+ List <Statement > bodyStatements =
327
+ bodyExprs .stream ().map (e -> ExprStatement .withExpr (e )).collect (Collectors .toList ());
328
+ bodyStatements .add (loopIteratorStatement );
329
+
330
+ return TryCatchStatement .builder ()
331
+ .setTryResourceExpr (assignClientVariableWithCreateMethodExpr (clientVarExpr ))
332
+ .setTryBody (bodyStatements )
333
+ .setIsSampleCode (true )
334
+ .build ();
335
+ }
336
+
293
337
// ==================================Helpers===================================================//
294
338
339
+ // Create a list of RPC method arguments' variable expressions.
340
+ private static List <VariableExpr > createRpcMethodArgumentVariableExprs (
341
+ List <MethodArgument > arguments ) {
342
+ return arguments .stream ()
343
+ .map (
344
+ arg ->
345
+ VariableExpr .withVariable (
346
+ Variable .builder ()
347
+ .setName (JavaStyle .toLowerCamelCase (arg .name ()))
348
+ .setType (arg .type ())
349
+ .build ()))
350
+ .collect (Collectors .toList ());
351
+ }
352
+
353
+ // Create a list of RPC method arguments' default value expression.
354
+ private static List <Expr > createRpcMethodArgumentDefaultValueExprs (
355
+ List <MethodArgument > arguments , Map <String , ResourceName > resourceNames ) {
356
+ List <ResourceName > resourceNameList =
357
+ resourceNames .values ().stream ().collect (Collectors .toList ());
358
+ Function <MethodArgument , MethodInvocationExpr > stringResourceNameDefaultValueExpr =
359
+ arg ->
360
+ MethodInvocationExpr .builder ()
361
+ .setExprReferenceExpr (
362
+ DefaultValueComposer .createDefaultValue (
363
+ resourceNames .get (arg .field ().resourceReference ().resourceTypeString ()),
364
+ resourceNameList ,
365
+ arg .field ().name ()))
366
+ .setMethodName ("toString" )
367
+ .setReturnType (TypeNode .STRING )
368
+ .build ();
369
+ return arguments .stream ()
370
+ .map (
371
+ arg ->
372
+ !isStringTypedResourceName (arg , resourceNames )
373
+ ? DefaultValueComposer .createDefaultValue (arg , resourceNames )
374
+ : stringResourceNameDefaultValueExpr .apply (arg ))
375
+ .collect (Collectors .toList ());
376
+ }
377
+
378
+ // Create a list of assignment expressions for variable expr with value expr.
379
+ private static List <Expr > createAssignmentsForVarExprsWithValueExprs (
380
+ List <VariableExpr > variableExprs , List <Expr > valueExprs ) {
381
+ Preconditions .checkState (
382
+ variableExprs .size () == valueExprs .size (),
383
+ "Expected the number of method arguments to match the number of default values." );
384
+ return IntStream .range (0 , variableExprs .size ())
385
+ .mapToObj (
386
+ i ->
387
+ AssignmentExpr .builder ()
388
+ .setVariableExpr (variableExprs .get (i ).toBuilder ().setIsDecl (true ).build ())
389
+ .setValueExpr (valueExprs .get (i ))
390
+ .build ())
391
+ .collect (Collectors .toList ());
392
+ }
393
+
295
394
// Assign client variable expr with create client.
296
395
// e.g EchoClient echoClient = EchoClient.create()
297
396
private static AssignmentExpr assignClientVariableWithCreateMethodExpr (
0 commit comments