30
30
import com .google .api .generator .engine .ast .EnumRefExpr ;
31
31
import com .google .api .generator .engine .ast .Expr ;
32
32
import com .google .api .generator .engine .ast .ExprStatement ;
33
+ import com .google .api .generator .engine .ast .IfStatement ;
33
34
import com .google .api .generator .engine .ast .MethodDefinition ;
34
35
import com .google .api .generator .engine .ast .MethodInvocationExpr ;
35
36
import com .google .api .generator .engine .ast .NewObjectExpr ;
42
43
import com .google .api .generator .engine .ast .VariableExpr ;
43
44
import com .google .api .generator .gapic .composer .common .AbstractServiceStubClassComposer ;
44
45
import com .google .api .generator .gapic .composer .store .TypeStore ;
46
+ import com .google .api .generator .gapic .model .HttpBindings .HttpBinding ;
45
47
import com .google .api .generator .gapic .model .Method ;
46
48
import com .google .api .generator .gapic .model .Service ;
47
49
import com .google .api .generator .gapic .utils .JavaStyle ;
@@ -357,9 +359,9 @@ private List<Expr> setResponseParserExpr(Method protoMethod) {
357
359
private Expr createFieldsExtractorAnonClass (
358
360
Method method ,
359
361
TypeNode extractorReturnType ,
360
- Set <String > httpBindingFieldNames ,
362
+ Set <HttpBinding > httpBindingFieldNames ,
361
363
String serializerMethodName ) {
362
- List <Expr > bodyExprs = new ArrayList <>();
364
+ List <Statement > bodyStatements = new ArrayList <>();
363
365
364
366
Expr returnExpr = null ;
365
367
VariableExpr fieldsVarExpr = null ;
@@ -389,7 +391,7 @@ private Expr createFieldsExtractorAnonClass(
389
391
.build ())
390
392
.build ();
391
393
392
- bodyExprs .add (fieldsAssignExpr );
394
+ bodyStatements .add (ExprStatement . withExpr ( fieldsAssignExpr ) );
393
395
returnExpr = fieldsVarExpr ;
394
396
395
397
TypeNode serializerVarType =
@@ -417,40 +419,57 @@ private Expr createFieldsExtractorAnonClass(
417
419
418
420
serializerExpr = serializerVarExpr ;
419
421
420
- bodyExprs .add (serializerAssignExpr );
422
+ bodyStatements .add (ExprStatement . withExpr ( serializerAssignExpr ) );
421
423
}
422
424
423
425
VariableExpr requestVarExpr =
424
426
VariableExpr .withVariable (
425
427
Variable .builder ().setType (method .inputType ()).setName ("request" ).build ());
426
428
427
- for (String httpBindingFieldName : httpBindingFieldNames ) {
429
+ for (HttpBinding httpBindingFieldName : httpBindingFieldNames ) {
428
430
// Handle foo.bar cases by descending into the subfields.
429
431
MethodInvocationExpr .Builder requestFieldGetterExprBuilder =
430
432
MethodInvocationExpr .builder ().setExprReferenceExpr (requestVarExpr );
431
- String [] descendantFields = httpBindingFieldName .split ("\\ ." );
433
+ MethodInvocationExpr .Builder requestFieldHasExprBuilder =
434
+ MethodInvocationExpr .builder ().setExprReferenceExpr (requestVarExpr );
435
+ String [] descendantFields = httpBindingFieldName .name ().split ("\\ ." );
432
436
for (int i = 0 ; i < descendantFields .length ; i ++) {
433
437
String currFieldName = descendantFields [i ];
434
438
String bindingFieldMethodName =
435
439
String .format ("get%s" , JavaStyle .toUpperCamelCase (currFieldName ));
436
440
requestFieldGetterExprBuilder =
437
441
requestFieldGetterExprBuilder .setMethodName (bindingFieldMethodName );
442
+
443
+ String bindingFieldHasMethodName =
444
+ (i < descendantFields .length - 1 )
445
+ ? bindingFieldMethodName
446
+ : String .format ("has%s" , JavaStyle .toUpperCamelCase (currFieldName ));
447
+ requestFieldHasExprBuilder =
448
+ requestFieldHasExprBuilder
449
+ .setMethodName (bindingFieldHasMethodName )
450
+ .setReturnType (TypeNode .BOOLEAN );
451
+
438
452
if (i < descendantFields .length - 1 ) {
439
453
requestFieldGetterExprBuilder =
440
454
MethodInvocationExpr .builder ()
441
455
.setExprReferenceExpr (requestFieldGetterExprBuilder .build ());
456
+ requestFieldHasExprBuilder =
457
+ MethodInvocationExpr .builder ()
458
+ .setExprReferenceExpr (requestFieldHasExprBuilder .build ());
442
459
}
443
460
}
444
461
445
462
MethodInvocationExpr requestBuilderExpr = requestFieldGetterExprBuilder .build ();
463
+ MethodInvocationExpr requestHasExpr = requestFieldHasExprBuilder .build ();
446
464
447
465
ImmutableList .Builder <Expr > paramsPutArgs = ImmutableList .builder ();
448
466
if (fieldsVarExpr != null ) {
449
467
paramsPutArgs .add (fieldsVarExpr );
450
468
}
451
469
paramsPutArgs .add (
452
470
ValueExpr .withValue (
453
- StringObjectValue .withValue (JavaStyle .toLowerCamelCase (httpBindingFieldName ))));
471
+ StringObjectValue .withValue (
472
+ JavaStyle .toLowerCamelCase (httpBindingFieldName .name ()))));
454
473
paramsPutArgs .add (requestBuilderExpr );
455
474
456
475
Expr paramsPutExpr =
@@ -464,7 +483,15 @@ private Expr createFieldsExtractorAnonClass(
464
483
if (fieldsVarExpr == null ) {
465
484
returnExpr = paramsPutExpr ;
466
485
} else {
467
- bodyExprs .add (paramsPutExpr );
486
+ if (httpBindingFieldName .isOptional ()) {
487
+ bodyStatements .add (
488
+ IfStatement .builder ()
489
+ .setConditionExpr (requestHasExpr )
490
+ .setBody (Arrays .asList (ExprStatement .withExpr (paramsPutExpr )))
491
+ .build ());
492
+ } else {
493
+ bodyStatements .add (ExprStatement .withExpr (paramsPutExpr ));
494
+ }
468
495
}
469
496
}
470
497
@@ -475,7 +502,7 @@ private Expr createFieldsExtractorAnonClass(
475
502
.setReturnType (extractorReturnType )
476
503
.setName ("extract" )
477
504
.setArguments (requestVarExpr .toBuilder ().setIsDecl (true ).build ())
478
- .setBody (bodyExprs . stream (). map ( ExprStatement :: withExpr ). collect ( Collectors . toList ()) )
505
+ .setBody (bodyStatements )
479
506
.setReturnExpr (returnExpr )
480
507
.build ();
481
508
0 commit comments