diff --git a/src/main/java/com/google/api/generator/gapic/composer/SampleCodeHelperComposer.java b/src/main/java/com/google/api/generator/gapic/composer/SampleCodeHelperComposer.java index 7afacdbcbd..99aa9061d6 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/SampleCodeHelperComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/SampleCodeHelperComposer.java @@ -15,6 +15,7 @@ package com.google.api.generator.gapic.composer; import com.google.api.core.ApiFuture; +import com.google.api.gax.longrunning.OperationFuture; import com.google.api.gax.rpc.ApiStreamObserver; import com.google.api.gax.rpc.BidiStream; import com.google.api.gax.rpc.ServerStream; @@ -46,6 +47,7 @@ import com.google.api.generator.gapic.model.MethodArgument; import com.google.api.generator.gapic.model.ResourceName; import com.google.api.generator.gapic.utils.JavaStyle; +import com.google.longrunning.Operation; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -64,6 +66,7 @@ public final class SampleCodeHelperComposer { private static String UNARY_CALLABLE_NAME_PATTERN = "%sCallable"; private static String PAGED_CALLABLE_NAME_PATTERN = "%sPagedCallable"; private static String PAGED_RESPONSE_NAME_PATTERN = "%sPagedResponse"; + private static String OPERATION_CALLABLE_NAME_PATTERN = "%sOperationCallable"; public static TryCatchStatement composeRpcMethodSampleCode( Method method, @@ -533,12 +536,117 @@ private static TryCatchStatement composeLroRpcCallableMethodSampleCode( TypeNode clientType, TypeNode returnType, Map resourceNames) { + // Initialize the method's arguments with default values. + List arguments = + method.methodSignatures().isEmpty() + ? Collections.emptyList() + : method.methodSignatures().get(0); + List bodyStatements = + arguments.stream() + .map( + methodArg -> + ExprStatement.withExpr( + assignMethodArgumentWithDefaultValue(methodArg, resourceNames))) + .collect(Collectors.toList()); + // Build request Variable Epxr with set attributes. + bodyStatements.add( + ExprStatement.withExpr(createRequestBuilderExpr(method.inputType(), arguments))); + + // If return type has 3 generics, add statements for OperationCallable method. + // otherwise, add statements for callable method. + if (returnType.reference().generics().size() == 3) { + // Initialize operation future variable with operation callable method. + // e.g.OperationFuture future = + // echoClient.waitOperationCallable().futureCall(request); + TypeNode operationFutureType = + TypeNode.withReference( + ConcreteReference.builder() + .setClazz(OperationFuture.class) + .setGenerics(method.inputType().reference(), method.outputType().reference()) + .build()); + VariableExpr operationFutureVarExpr = createVariableExpr(FUTURE, operationFutureType); + MethodInvocationExpr futureCallMethodExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr( + MethodInvocationExpr.builder() + .setExprReferenceExpr( + createVariableExpr(getClientName(clientType), clientType)) + .setMethodName(getOperationCallableName(method.name())) + .build()) + .setArguments(createVariableExpr(REQUEST, method.inputType())) + .setMethodName("futureCall") + .setReturnType(operationFutureType) + .build(); + bodyStatements.add( + ExprStatement.withExpr( + AssignmentExpr.builder() + .setVariableExpr(operationFutureVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(futureCallMethodExpr) + .build())); + // Create comment line + bodyStatements.add(createLineCommentStatement("Do something.")); + // Assign response variable with get method. + // e.g. WaitResponse response = future.get(); + TypeNode waitResponseType = TypeNode.withReference(returnType.reference().generics().get(1)); + bodyStatements.add( + ExprStatement.withExpr( + AssignmentExpr.builder() + .setVariableExpr(createVariableDeclExpr(RESPONSE, waitResponseType)) + .setValueExpr( + MethodInvocationExpr.builder() + .setExprReferenceExpr(operationFutureVarExpr) + .setMethodName("get") + .setReturnType(waitResponseType) + .build()) + .build())); + } else { + // Initialize Api future variable with callable method. + // e.g ApiFuture future = echoClient.waitCallable().futureCall(request); + TypeNode apiFutureType = + TypeNode.withReference( + ConcreteReference.builder() + .setClazz(ApiFuture.class) + .setGenerics(ConcreteReference.withClazz(Operation.class)) + .build()); + VariableExpr apiFutureVarExpr = createVariableExpr("future", apiFutureType); + MethodInvocationExpr futureCallMethodExpr = + MethodInvocationExpr.builder() + .setExprReferenceExpr( + MethodInvocationExpr.builder() + .setExprReferenceExpr( + createVariableExpr(getClientName(clientType), clientType)) + .setMethodName(getCallableMethodName(method.name())) + .build()) + .setMethodName("futureCall") + .setArguments(createVariableExpr(REQUEST, method.inputType())) + .setReturnType(apiFutureType) + .build(); + bodyStatements.add( + ExprStatement.withExpr( + AssignmentExpr.builder() + .setVariableExpr(apiFutureVarExpr.toBuilder().setIsDecl(true).build()) + .setValueExpr(futureCallMethodExpr) + .build())); + // Create comment line + bodyStatements.add(createLineCommentStatement("Do something.")); + // Assign response variable with get method. + // e.g. Operation response = future.get(); + bodyStatements.add( + ExprStatement.withExpr( + AssignmentExpr.builder() + .setVariableExpr(createVariableDeclExpr(RESPONSE, method.outputType())) + .setValueExpr( + MethodInvocationExpr.builder() + .setExprReferenceExpr(apiFutureVarExpr) + .setMethodName("get") + .setReturnType(method.outputType()) + .build()) + .build())); + } + return TryCatchStatement.builder() .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientType)) - .setTryBody( - Arrays.asList( - createLineCommentStatement( - "Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code."))) + .setTryBody(bodyStatements) .setIsSampleCode(true) .build(); } @@ -899,6 +1007,10 @@ private static String getPagedCallableName(String methodName) { return JavaStyle.toLowerCamelCase(String.format(PAGED_CALLABLE_NAME_PATTERN, methodName)); } + private static String getOperationCallableName(String methodName) { + return JavaStyle.toLowerCamelCase(String.format(OPERATION_CALLABLE_NAME_PATTERN, methodName)); + } + private static CommentStatement createLineCommentStatement(String content) { return CommentStatement.withComment(LineComment.withComment(content)); } diff --git a/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden b/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden index 2ebdf81cea..315fab6742 100644 --- a/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden +++ b/src/test/java/com/google/api/generator/gapic/composer/goldens/EchoClient.golden @@ -542,7 +542,12 @@ public class EchoClient implements BackgroundResource { * *
{@code
    * try (EchoClient echoClient = EchoClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   Duration ttl = Duration.newBuilder().build();
+   *   WaitRequest request = WaitRequest.newBuilder().setTtl(ttl).build();
+   *   OperationFuture future =
+   *       echoClient.waitOperationCallable().futureCall(request);
+   *   // Do something.
+   *   WaitResponse response = future.get();
    * }
    * }
*/ @@ -556,7 +561,11 @@ public class EchoClient implements BackgroundResource { * *
{@code
    * try (EchoClient echoClient = EchoClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   Duration ttl = Duration.newBuilder().build();
+   *   WaitRequest request = WaitRequest.newBuilder().setTtl(ttl).build();
+   *   ApiFuture future = echoClient.waitCallable().futureCall(request);
+   *   // Do something.
+   *   Operation response = future.get();
    * }
    * }
*/ diff --git a/test/integration/goldens/asset/AssetServiceClient.java b/test/integration/goldens/asset/AssetServiceClient.java index 6e7d225027..43cbe6093f 100644 --- a/test/integration/goldens/asset/AssetServiceClient.java +++ b/test/integration/goldens/asset/AssetServiceClient.java @@ -198,7 +198,11 @@ public final OperationFuture exportAs * *
{@code
    * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   ExportAssetsRequest request = ExportAssetsRequest.newBuilder().build();
+   *   OperationFuture future =
+   *       assetServiceClient.exportAssetsOperationCallable().futureCall(request);
+   *   // Do something.
+   *   ExportAssetsResponse response = future.get();
    * }
    * }
*/ @@ -222,7 +226,10 @@ public final OperationFuture exportAs * *
{@code
    * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   ExportAssetsRequest request = ExportAssetsRequest.newBuilder().build();
+   *   ApiFuture future = assetServiceClient.exportAssetsCallable().futureCall(request);
+   *   // Do something.
+   *   Operation response = future.get();
    * }
    * }
*/ diff --git a/test/integration/goldens/redis/CloudRedisClient.java b/test/integration/goldens/redis/CloudRedisClient.java index 09d6ee57b9..d5a14046fd 100644 --- a/test/integration/goldens/redis/CloudRedisClient.java +++ b/test/integration/goldens/redis/CloudRedisClient.java @@ -605,7 +605,19 @@ public final OperationFuture createInstanceAsync( * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   LocationName parent = LocationName.of("[PROJECT]", "[LOCATION]");
+   *   String instance_id = "instance_id-2101995259";
+   *   Instance instance = Instance.newBuilder().build();
+   *   CreateInstanceRequest request =
+   *       CreateInstanceRequest.newBuilder()
+   *           .setParent(parent)
+   *           .setInstanceId(instance_id)
+   *           .setInstance(instance)
+   *           .build();
+   *   OperationFuture future =
+   *       cloudRedisClient.createInstanceOperationCallable().futureCall(request);
+   *   // Do something.
+   *   Instance response = future.get();
    * }
    * }
*/ @@ -633,7 +645,18 @@ public final OperationFuture createInstanceAsync( * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   LocationName parent = LocationName.of("[PROJECT]", "[LOCATION]");
+   *   String instance_id = "instance_id-2101995259";
+   *   Instance instance = Instance.newBuilder().build();
+   *   CreateInstanceRequest request =
+   *       CreateInstanceRequest.newBuilder()
+   *           .setParent(parent)
+   *           .setInstanceId(instance_id)
+   *           .setInstance(instance)
+   *           .build();
+   *   ApiFuture future = cloudRedisClient.createInstanceCallable().futureCall(request);
+   *   // Do something.
+   *   Operation response = future.get();
    * }
    * }
*/ @@ -716,7 +739,17 @@ public final OperationFuture updateInstanceAsync( * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   FieldMask update_mask = FieldMask.newBuilder().build();
+   *   Instance instance = Instance.newBuilder().build();
+   *   UpdateInstanceRequest request =
+   *       UpdateInstanceRequest.newBuilder()
+   *           .setUpdateMask(update_mask)
+   *           .setInstance(instance)
+   *           .build();
+   *   OperationFuture future =
+   *       cloudRedisClient.updateInstanceOperationCallable().futureCall(request);
+   *   // Do something.
+   *   Instance response = future.get();
    * }
    * }
*/ @@ -737,7 +770,16 @@ public final OperationFuture updateInstanceAsync( * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   FieldMask update_mask = FieldMask.newBuilder().build();
+   *   Instance instance = Instance.newBuilder().build();
+   *   UpdateInstanceRequest request =
+   *       UpdateInstanceRequest.newBuilder()
+   *           .setUpdateMask(update_mask)
+   *           .setInstance(instance)
+   *           .build();
+   *   ApiFuture future = cloudRedisClient.updateInstanceCallable().futureCall(request);
+   *   // Do something.
+   *   Operation response = future.get();
    * }
    * }
*/ @@ -834,7 +876,14 @@ public final OperationFuture upgradeInstanceAsync( * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   InstanceName name = InstanceName.of("[PROJECT]", "[LOCATION]", "[INSTANCE]");
+   *   String redis_version = "redis_version-685310444";
+   *   UpgradeInstanceRequest request =
+   *       UpgradeInstanceRequest.newBuilder().setName(name).setRedisVersion(redis_version).build();
+   *   OperationFuture future =
+   *       cloudRedisClient.upgradeInstanceOperationCallable().futureCall(request);
+   *   // Do something.
+   *   Instance response = future.get();
    * }
    * }
*/ @@ -851,7 +900,13 @@ public final OperationFuture upgradeInstanceAsync( * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   InstanceName name = InstanceName.of("[PROJECT]", "[LOCATION]", "[INSTANCE]");
+   *   String redis_version = "redis_version-685310444";
+   *   UpgradeInstanceRequest request =
+   *       UpgradeInstanceRequest.newBuilder().setName(name).setRedisVersion(redis_version).build();
+   *   ApiFuture future = cloudRedisClient.upgradeInstanceCallable().futureCall(request);
+   *   // Do something.
+   *   Operation response = future.get();
    * }
    * }
*/ @@ -936,7 +991,14 @@ public final OperationFuture importInstanceAsync( * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   String name = "name3373707";
+   *   InputConfig input_config = InputConfig.newBuilder().build();
+   *   ImportInstanceRequest request =
+   *       ImportInstanceRequest.newBuilder().setName(name).setInputConfig(input_config).build();
+   *   OperationFuture future =
+   *       cloudRedisClient.importInstanceOperationCallable().futureCall(request);
+   *   // Do something.
+   *   Instance response = future.get();
    * }
    * }
*/ @@ -959,7 +1021,13 @@ public final OperationFuture importInstanceAsync( * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   String name = "name3373707";
+   *   InputConfig input_config = InputConfig.newBuilder().build();
+   *   ImportInstanceRequest request =
+   *       ImportInstanceRequest.newBuilder().setName(name).setInputConfig(input_config).build();
+   *   ApiFuture future = cloudRedisClient.importInstanceCallable().futureCall(request);
+   *   // Do something.
+   *   Operation response = future.get();
    * }
    * }
*/ @@ -1041,7 +1109,14 @@ public final OperationFuture exportInstanceAsync( * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   String name = "name3373707";
+   *   OutputConfig output_config = OutputConfig.newBuilder().build();
+   *   ExportInstanceRequest request =
+   *       ExportInstanceRequest.newBuilder().setName(name).setOutputConfig(output_config).build();
+   *   OperationFuture future =
+   *       cloudRedisClient.exportInstanceOperationCallable().futureCall(request);
+   *   // Do something.
+   *   Instance response = future.get();
    * }
    * }
*/ @@ -1063,7 +1138,13 @@ public final OperationFuture exportInstanceAsync( * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   String name = "name3373707";
+   *   OutputConfig output_config = OutputConfig.newBuilder().build();
+   *   ExportInstanceRequest request =
+   *       ExportInstanceRequest.newBuilder().setName(name).setOutputConfig(output_config).build();
+   *   ApiFuture future = cloudRedisClient.exportInstanceCallable().futureCall(request);
+   *   // Do something.
+   *   Operation response = future.get();
    * }
    * }
*/ @@ -1175,7 +1256,18 @@ public final OperationFuture failoverInstanceAsync( * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   InstanceName name = InstanceName.of("[PROJECT]", "[LOCATION]", "[INSTANCE]");
+   *   FailoverInstanceRequest.DataProtectionMode data_protection_mode =
+   *       FailoverInstanceRequest.DataProtectionMode.forNumber(0);
+   *   FailoverInstanceRequest request =
+   *       FailoverInstanceRequest.newBuilder()
+   *           .setName(name)
+   *           .setDataProtectionMode(data_protection_mode)
+   *           .build();
+   *   OperationFuture future =
+   *       cloudRedisClient.failoverInstanceOperationCallable().futureCall(request);
+   *   // Do something.
+   *   Instance response = future.get();
    * }
    * }
*/ @@ -1193,7 +1285,17 @@ public final OperationFuture failoverInstanceAsync( * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   InstanceName name = InstanceName.of("[PROJECT]", "[LOCATION]", "[INSTANCE]");
+   *   FailoverInstanceRequest.DataProtectionMode data_protection_mode =
+   *       FailoverInstanceRequest.DataProtectionMode.forNumber(0);
+   *   FailoverInstanceRequest request =
+   *       FailoverInstanceRequest.newBuilder()
+   *           .setName(name)
+   *           .setDataProtectionMode(data_protection_mode)
+   *           .build();
+   *   ApiFuture future = cloudRedisClient.failoverInstanceCallable().futureCall(request);
+   *   // Do something.
+   *   Operation response = future.get();
    * }
    * }
*/ @@ -1280,7 +1382,12 @@ public final OperationFuture deleteInstanceAsync( * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   InstanceName name = InstanceName.of("[PROJECT]", "[LOCATION]", "[INSTANCE]");
+   *   DeleteInstanceRequest request = DeleteInstanceRequest.newBuilder().setName(name).build();
+   *   OperationFuture future =
+   *       cloudRedisClient.deleteInstanceOperationCallable().futureCall(request);
+   *   // Do something.
+   *   Empty response = future.get();
    * }
    * }
*/ @@ -1297,7 +1404,11 @@ public final OperationFuture deleteInstanceAsync( * *
{@code
    * try (CloudRedisClient cloudRedisClient = CloudRedisClient.create()) {
-   *   // Note: Not implement yet, placeholder for Lro Rpc callable methods' sample code.
+   *   InstanceName name = InstanceName.of("[PROJECT]", "[LOCATION]", "[INSTANCE]");
+   *   DeleteInstanceRequest request = DeleteInstanceRequest.newBuilder().setName(name).build();
+   *   ApiFuture future = cloudRedisClient.deleteInstanceCallable().futureCall(request);
+   *   // Do something.
+   *   Operation response = future.get();
    * }
    * }
*/