3030import com .google .api .generator .engine .ast .EnumRefExpr ;
3131import com .google .api .generator .engine .ast .Expr ;
3232import com .google .api .generator .engine .ast .ExprStatement ;
33+ import com .google .api .generator .engine .ast .IfStatement ;
3334import com .google .api .generator .engine .ast .MethodDefinition ;
3435import com .google .api .generator .engine .ast .MethodInvocationExpr ;
3536import com .google .api .generator .engine .ast .NewObjectExpr ;
4243import com .google .api .generator .engine .ast .VariableExpr ;
4344import com .google .api .generator .gapic .composer .common .AbstractServiceStubClassComposer ;
4445import com .google .api .generator .gapic .composer .store .TypeStore ;
46+ import com .google .api .generator .gapic .model .HttpBindings .HttpBinding ;
4547import com .google .api .generator .gapic .model .Method ;
4648import com .google .api .generator .gapic .model .Service ;
4749import com .google .api .generator .gapic .utils .JavaStyle ;
@@ -357,9 +359,9 @@ private List<Expr> setResponseParserExpr(Method protoMethod) {
357359 private Expr createFieldsExtractorAnonClass (
358360 Method method ,
359361 TypeNode extractorReturnType ,
360- Set <String > httpBindingFieldNames ,
362+ Set <HttpBinding > httpBindingFieldNames ,
361363 String serializerMethodName ) {
362- List <Expr > bodyExprs = new ArrayList <>();
364+ List <Statement > bodyStatements = new ArrayList <>();
363365
364366 Expr returnExpr = null ;
365367 VariableExpr fieldsVarExpr = null ;
@@ -389,7 +391,7 @@ private Expr createFieldsExtractorAnonClass(
389391 .build ())
390392 .build ();
391393
392- bodyExprs .add (fieldsAssignExpr );
394+ bodyStatements .add (ExprStatement . withExpr ( fieldsAssignExpr ) );
393395 returnExpr = fieldsVarExpr ;
394396
395397 TypeNode serializerVarType =
@@ -417,40 +419,57 @@ private Expr createFieldsExtractorAnonClass(
417419
418420 serializerExpr = serializerVarExpr ;
419421
420- bodyExprs .add (serializerAssignExpr );
422+ bodyStatements .add (ExprStatement . withExpr ( serializerAssignExpr ) );
421423 }
422424
423425 VariableExpr requestVarExpr =
424426 VariableExpr .withVariable (
425427 Variable .builder ().setType (method .inputType ()).setName ("request" ).build ());
426428
427- for (String httpBindingFieldName : httpBindingFieldNames ) {
429+ for (HttpBinding httpBindingFieldName : httpBindingFieldNames ) {
428430 // Handle foo.bar cases by descending into the subfields.
429431 MethodInvocationExpr .Builder requestFieldGetterExprBuilder =
430432 MethodInvocationExpr .builder ().setExprReferenceExpr (requestVarExpr );
431- String [] descendantFields = httpBindingFieldName .split ("\\ ." );
433+ MethodInvocationExpr .Builder requestFieldHasExprBuilder =
434+ MethodInvocationExpr .builder ().setExprReferenceExpr (requestVarExpr );
435+ String [] descendantFields = httpBindingFieldName .name ().split ("\\ ." );
432436 for (int i = 0 ; i < descendantFields .length ; i ++) {
433437 String currFieldName = descendantFields [i ];
434438 String bindingFieldMethodName =
435439 String .format ("get%s" , JavaStyle .toUpperCamelCase (currFieldName ));
436440 requestFieldGetterExprBuilder =
437441 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+
438452 if (i < descendantFields .length - 1 ) {
439453 requestFieldGetterExprBuilder =
440454 MethodInvocationExpr .builder ()
441455 .setExprReferenceExpr (requestFieldGetterExprBuilder .build ());
456+ requestFieldHasExprBuilder =
457+ MethodInvocationExpr .builder ()
458+ .setExprReferenceExpr (requestFieldHasExprBuilder .build ());
442459 }
443460 }
444461
445462 MethodInvocationExpr requestBuilderExpr = requestFieldGetterExprBuilder .build ();
463+ MethodInvocationExpr requestHasExpr = requestFieldHasExprBuilder .build ();
446464
447465 ImmutableList .Builder <Expr > paramsPutArgs = ImmutableList .builder ();
448466 if (fieldsVarExpr != null ) {
449467 paramsPutArgs .add (fieldsVarExpr );
450468 }
451469 paramsPutArgs .add (
452470 ValueExpr .withValue (
453- StringObjectValue .withValue (JavaStyle .toLowerCamelCase (httpBindingFieldName ))));
471+ StringObjectValue .withValue (
472+ JavaStyle .toLowerCamelCase (httpBindingFieldName .name ()))));
454473 paramsPutArgs .add (requestBuilderExpr );
455474
456475 Expr paramsPutExpr =
@@ -464,7 +483,15 @@ private Expr createFieldsExtractorAnonClass(
464483 if (fieldsVarExpr == null ) {
465484 returnExpr = paramsPutExpr ;
466485 } 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+ }
468495 }
469496 }
470497
@@ -475,7 +502,7 @@ private Expr createFieldsExtractorAnonClass(
475502 .setReturnType (extractorReturnType )
476503 .setName ("extract" )
477504 .setArguments (requestVarExpr .toBuilder ().setIsDecl (true ).build ())
478- .setBody (bodyExprs . stream (). map ( ExprStatement :: withExpr ). collect ( Collectors . toList ()) )
505+ .setBody (bodyStatements )
479506 .setReturnExpr (returnExpr )
480507 .build ();
481508
0 commit comments