Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -813,9 +813,9 @@ private static MethodDefinition createCallableMethod(

if (callableMethodKind.equals(CallableMethodKind.REGULAR)
&& method.stream().equals(Stream.NONE)) {
// TODO(summerji): Remove the following if condition after implement paged and lro in
// TODO(summerji): Remove the following if condition after implement paged in
// composeRegularCallableMethodHeaderSampleCode
if (!method.isPaged() && !method.hasLro()) {
if (!method.isPaged()) {
sampleCodeOpt =
Optional.of(
ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import com.google.api.generator.gapic.model.ResourceName;
import com.google.api.generator.gapic.utils.JavaStyle;
import com.google.common.base.Preconditions;
import com.google.longrunning.Operation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
Expand Down Expand Up @@ -222,15 +223,15 @@ public static String composeRpcMethodHeaderSampleCode(
List<Statement> bodyStatements = new ArrayList<>();
if (method.isPaged()) {
bodyStatements.addAll(
composeUnaryPagedRpcMethodSampleCodeBodyStatements(
composePagedRpcMethodBodyStatements(
method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs, messageTypes));
} else if (method.hasLro()) {
bodyStatements.addAll(
composeUnaryLroRpcMethodSampleCodeBodyStatements(
composeLroRpcMethodBodyStatements(
method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs));
} else {
bodyStatements.addAll(
composeUnaryRpcMethodSampleCodeBodyStatements(
composeUnaryRpcMethodBodyStatements(
method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs));
}

Expand Down Expand Up @@ -279,15 +280,15 @@ public static String composeRpcDefaultMethodHeaderSampleCode(
List<Statement> bodyStatements = new ArrayList<>();
if (method.isPaged()) {
bodyStatements.addAll(
composeUnaryPagedRpcMethodSampleCodeBodyStatements(
composePagedRpcMethodBodyStatements(
method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs, messageTypes));
} else if (method.hasLro()) {
bodyStatements.addAll(
composeUnaryLroRpcMethodSampleCodeBodyStatements(
composeLroRpcMethodBodyStatements(
method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs));
} else {
bodyStatements.addAll(
composeUnaryRpcMethodSampleCodeBodyStatements(
composeUnaryRpcMethodBodyStatements(
method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs));
}

Expand Down Expand Up @@ -380,8 +381,8 @@ public static String composeLroCallableMethodHeaderSampleCode(
.setMethodName("get")
.setReturnType(method.lro().responseType())
.build();
boolean returnVoid = isProtoEmptyType(method.lro().responseType());
if (returnVoid) {
boolean returnsVoid = isProtoEmptyType(method.lro().responseType());
if (returnsVoid) {
bodyExprs.add(futureGetMethodExpr);
} else {
VariableExpr responseVarExpr =
Expand Down Expand Up @@ -566,9 +567,9 @@ public static String composeRegularCallableMethodHeaderSampleCode(

List<Statement> bodyStatements = new ArrayList<>();

if (!method.isPaged() && !method.hasLro()) {
if (!method.isPaged()) {
bodyStatements.addAll(
composeUnaryCallableSampleCodeBodyStatements(
composeUnaryOrLroCallableBodyStatements(
method, clientVarExpr, requestVarExpr, bodyExprs));
}

Expand Down Expand Up @@ -612,15 +613,13 @@ public static String composeStreamCallableMethodHeaderSampleCode(
List<Statement> bodyStatements = new ArrayList<>();
if (method.stream().equals(Stream.SERVER)) {
bodyStatements.addAll(
composeStreamServerSampleCodeBodyStatements(
method, clientVarExpr, requestAssignmentExpr));
composeStreamServerBodyStatements(method, clientVarExpr, requestAssignmentExpr));
} else if (method.stream().equals(Stream.BIDI)) {
bodyStatements.addAll(
composeStreamBidiSampleCodeBodyStatements(method, clientVarExpr, requestAssignmentExpr));
composeStreamBidiBodyStatements(method, clientVarExpr, requestAssignmentExpr));
} else if (method.stream().equals(Stream.CLIENT)) {
bodyStatements.addAll(
composeStreamClientSampleCodeBodyStatements(
method, clientVarExpr, requestAssignmentExpr));
composeStreamClientBodyStatements(method, clientVarExpr, requestAssignmentExpr));
}

return SampleCodeWriter.write(
Expand All @@ -631,7 +630,7 @@ public static String composeStreamCallableMethodHeaderSampleCode(
.build());
}

private static List<Statement> composeUnaryRpcMethodSampleCodeBodyStatements(
private static List<Statement> composeUnaryRpcMethodBodyStatements(
Method method,
VariableExpr clientVarExpr,
List<VariableExpr> rpcMethodArgVarExprs,
Expand Down Expand Up @@ -665,7 +664,7 @@ private static List<Statement> composeUnaryRpcMethodSampleCodeBodyStatements(
return bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
}

private static List<Statement> composeUnaryPagedRpcMethodSampleCodeBodyStatements(
private static List<Statement> composePagedRpcMethodBodyStatements(
Method method,
VariableExpr clientVarExpr,
List<VariableExpr> rpcMethodArgVarExprs,
Expand Down Expand Up @@ -722,7 +721,7 @@ private static List<Statement> composeUnaryPagedRpcMethodSampleCodeBodyStatement
return bodyStatements;
}

private static List<Statement> composeUnaryLroRpcMethodSampleCodeBodyStatements(
private static List<Statement> composeLroRpcMethodBodyStatements(
Method method,
VariableExpr clientVarExpr,
List<VariableExpr> rpcMethodArgVarExprs,
Expand Down Expand Up @@ -766,7 +765,7 @@ private static List<Statement> composeUnaryLroRpcMethodSampleCodeBodyStatements(
return bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
}

private static List<Statement> composeStreamServerSampleCodeBodyStatements(
private static List<Statement> composeStreamServerBodyStatements(
Method method, VariableExpr clientVarExpr, AssignmentExpr requestAssignmentExpr) {
List<Expr> bodyExprs = new ArrayList<>();
bodyExprs.add(requestAssignmentExpr);
Expand Down Expand Up @@ -829,7 +828,7 @@ private static List<Statement> composeStreamServerSampleCodeBodyStatements(
return bodyStatements;
}

private static List<Statement> composeStreamBidiSampleCodeBodyStatements(
private static List<Statement> composeStreamBidiBodyStatements(
Method method, VariableExpr clientVarExpr, AssignmentExpr requestAssignmentExpr) {
List<Expr> bodyExprs = new ArrayList<>();

Expand Down Expand Up @@ -902,7 +901,7 @@ private static List<Statement> composeStreamBidiSampleCodeBodyStatements(
return bodyStatements;
}

private static List<Statement> composeStreamClientSampleCodeBodyStatements(
private static List<Statement> composeStreamClientBodyStatements(
Method method, VariableExpr clientVarExpr, AssignmentExpr requestAssignmentExpr) {
List<Expr> bodyExprs = new ArrayList<>();

Expand Down Expand Up @@ -1028,7 +1027,7 @@ private static List<Statement> composeStreamClientSampleCodeBodyStatements(
return bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
}

private static List<Statement> composeUnaryCallableSampleCodeBodyStatements(
private static List<Statement> composeUnaryOrLroCallableBodyStatements(
Method method,
VariableExpr clientVarExpr,
VariableExpr requestVarExpr,
Expand All @@ -1041,7 +1040,10 @@ private static List<Statement> composeUnaryCallableSampleCodeBodyStatements(
TypeNode.withReference(
ConcreteReference.builder()
.setClazz(ApiFuture.class)
.setGenerics(method.outputType().reference())
.setGenerics(
method.hasLro()
? ConcreteReference.withClazz(Operation.class)
: method.outputType().reference())
.build());
VariableExpr apiFutureVarExpr =
VariableExpr.withVariable(
Expand Down Expand Up @@ -1075,8 +1077,9 @@ private static List<Statement> composeUnaryCallableSampleCodeBodyStatements(
.setMethodName("get")
.setReturnType(method.outputType())
.build();
boolean returnVoid = isProtoEmptyType(method.outputType());
if (returnVoid) {
TypeNode methodOutputType = method.hasLro() ? method.lro().responseType() : method.outputType();
boolean returnsVoid = isProtoEmptyType(methodOutputType);
if (returnsVoid) {
bodyStatements.add(ExprStatement.withExpr(getMethodInvocationExpr));
} else {
VariableExpr responseVarExpr =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -657,7 +657,18 @@ public class EchoClient implements BackgroundResource {
}

// AUTO-GENERATED DOCUMENTATION AND METHOD.
/** Sample code: */
/**
* Sample code:
*
* <pre>{@code
* try (EchoClient echoClient = EchoClient.create()) {
* WaitRequest request = WaitRequest.newBuilder().build();
* ApiFuture<Operation> future = echoClient.waitCallable().futureCall(request);
* // Do something.
* Operation response = future.get();
* }
* }</pre>
*/
public final UnaryCallable<WaitRequest, Operation> waitCallable() {
return stub.waitCallable();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2008,6 +2008,114 @@ public void validComposeRegularCallableMethodHeaderSampleCode_unaryRpc() {
assertEquals(results, expected);
}

@Test
public void validComposeRegularCallableMethodHeaderSampleCode_lroRpc() {
FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
Map<String, ResourceName> resourceNames = Parser.parseResourceNames(echoFileDescriptor);
Map<String, Message> messageTypes = Parser.parseMessages(echoFileDescriptor);
TypeNode clientType =
TypeNode.withReference(
VaporReference.builder()
.setName("EchoClient")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
TypeNode inputType =
TypeNode.withReference(
VaporReference.builder()
.setName("WaitRequest")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
TypeNode outputType =
TypeNode.withReference(
VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
TypeNode responseType =
TypeNode.withReference(
VaporReference.builder()
.setName("WaitResponse")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
TypeNode metadataType =
TypeNode.withReference(
VaporReference.builder()
.setName("WaitMetadata")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType);
Method method =
Method.builder()
.setName("Wait")
.setInputType(inputType)
.setOutputType(outputType)
.setLro(lro)
.build();
String results =
ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
method, clientType, resourceNames, messageTypes);
String expected =
LineFormatter.lines(
"try (EchoClient echoClient = EchoClient.create()) {\n",
" WaitRequest request = WaitRequest.newBuilder().build();\n",
" ApiFuture<Operation> future = echoClient.waitCallable().futureCall(request);\n",
" // Do something.\n",
" Operation response = future.get();\n",
"}");
assertEquals(results, expected);
}

@Test
public void validComposeRegularCallableMethodHeaderSampleCode_lroRpcWithReturnVoid() {
FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
Map<String, ResourceName> resourceNames = Parser.parseResourceNames(echoFileDescriptor);
Map<String, Message> messageTypes = Parser.parseMessages(echoFileDescriptor);
TypeNode clientType =
TypeNode.withReference(
VaporReference.builder()
.setName("EchoClient")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
TypeNode inputType =
TypeNode.withReference(
VaporReference.builder()
.setName("WaitRequest")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
TypeNode outputType =
TypeNode.withReference(
VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
TypeNode responseType =
TypeNode.withReference(
VaporReference.builder()
.setName("Empty")
.setPakkage(PROTO_PACKAGE_NAME)
.build());
TypeNode metadataType =
TypeNode.withReference(
VaporReference.builder()
.setName("WaitMetadata")
.setPakkage(SHOWCASE_PACKAGE_NAME)
.build());
LongrunningOperation lro = LongrunningOperation.withTypes(responseType, metadataType);
Method method =
Method.builder()
.setName("Wait")
.setInputType(inputType)
.setOutputType(outputType)
.setLro(lro)
.build();
String results =
ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
method, clientType, resourceNames, messageTypes);
String expected =
LineFormatter.lines(
"try (EchoClient echoClient = EchoClient.create()) {\n",
" WaitRequest request = WaitRequest.newBuilder().build();\n",
" ApiFuture<Operation> future = echoClient.waitCallable().futureCall(request);\n",
" // Do something.\n",
" future.get();\n",
"}");
assertEquals(results, expected);
}

@Test
public void invalidComposeRegularCallableMethodHeaderSampleCode_noExistMethodRequest() {
FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
Expand Down
15 changes: 15 additions & 0 deletions test/integration/goldens/asset/AssetServiceClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,21 @@ public final OperationFuture<ExportAssetsResponse, ExportAssetsRequest> exportAs
* export operation usually finishes within 5 minutes.
*
* <p>Sample code:
*
* <pre>{@code
* try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) {
* ExportAssetsRequest request =
* ExportAssetsRequest.newBuilder()
* .setParent(FeedName.ofProjectFeedName("[PROJECT]", "[FEED]").toString())
* .setReadTime(Timestamp.newBuilder().build())
* .addAllAssetTypes(new ArrayList<String>())
* .setOutputConfig(OutputConfig.newBuilder().build())
* .build();
* ApiFuture<Operation> future = assetServiceClient.exportAssetsCallable().futureCall(request);
* // Do something.
* Operation response = future.get();
* }
* }</pre>
*/
public final UnaryCallable<ExportAssetsRequest, Operation> exportAssetsCallable() {
return stub.exportAssetsCallable();
Expand Down
Loading