Skip to content

Commit

Permalink
Implemente LRO Operation Callable Method sample code
Browse files Browse the repository at this point in the history
  • Loading branch information
summer-ji-eng committed Dec 15, 2020
1 parent 25d6723 commit abc6879
Show file tree
Hide file tree
Showing 6 changed files with 264 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,8 @@ private static List<MethodDefinition> createServiceMethods(
createMethodDefaultMethod(method, clientName, messageTypes, types, resourceNames));
}
if (method.hasLro()) {
javaMethods.add(createLroCallableMethod(service, method, types));
javaMethods.add(
createLroCallableMethod(service, method, types, messageTypes, resourceNames));
}
if (method.isPaged()) {
javaMethods.add(createPagedCallableMethod(service, method, types));
Expand Down Expand Up @@ -669,25 +670,44 @@ private static MethodDefinition createMethodDefaultMethod(
}

private static MethodDefinition createLroCallableMethod(
Service service, Method method, Map<String, TypeNode> types) {
return createCallableMethod(service, method, types, CallableMethodKind.LRO);
Service service,
Method method,
Map<String, TypeNode> types,
Map<String, Message> messageTypes,
Map<String, ResourceName> resourceNames) {
return createCallableMethod(
service, method, CallableMethodKind.LRO, types, messageTypes, resourceNames);
}

private static MethodDefinition createCallableMethod(
Service service, Method method, Map<String, TypeNode> types) {
return createCallableMethod(service, method, types, CallableMethodKind.REGULAR);
return createCallableMethod(
service,
method,
CallableMethodKind.REGULAR,
types,
Collections.emptyMap(),
Collections.emptyMap());
}

private static MethodDefinition createPagedCallableMethod(
Service service, Method method, Map<String, TypeNode> types) {
return createCallableMethod(service, method, types, CallableMethodKind.PAGED);
return createCallableMethod(
service,
method,
CallableMethodKind.PAGED,
types,
Collections.emptyMap(),
Collections.emptyMap());
}

private static MethodDefinition createCallableMethod(
Service service,
Method method,
CallableMethodKind callableMethodKind,
Map<String, TypeNode> types,
CallableMethodKind callableMethodKind) {
Map<String, Message> messageTypes,
Map<String, ResourceName> resourceNames) {
TypeNode rawCallableReturnType = null;
if (callableMethodKind.equals(CallableMethodKind.LRO)) {
rawCallableReturnType = types.get("OperationCallable");
Expand Down Expand Up @@ -729,9 +749,19 @@ private static MethodDefinition createCallableMethod(
.setReturnType(returnType)
.build();

Optional<String> sampleCode = Optional.empty();
// TODO (summerji): Implement sample code for CallableMethodKind.PAGED and
// CallableMethodKind.REGULAR
if (callableMethodKind.equals(CallableMethodKind.LRO)) {
sampleCode =
Optional.of(
ServiceClientSampleCodeComposer.composeRpcLroCallableMethodHeaderSampleCode(
method, types.get(getClientClassName(service)), resourceNames, messageTypes));
}

return MethodDefinition.builder()
.setHeaderCommentStatements(
ServiceClientCommentComposer.createRpcCallableMethodHeaderComment(method))
ServiceClientCommentComposer.createRpcCallableMethodHeaderComment(method, sampleCode))
.setScope(ScopeNode.PUBLIC)
.setIsFinal(true)
.setName(methodName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,8 @@ static CommentStatement createMethodSettingsArgComment(String serviceName) {
return toSimpleComment(String.format(CREATE_METHOD_SETTINGS_ARG_PATTERN, serviceName));
}

static List<CommentStatement> createRpcCallableMethodHeaderComment(Method method) {
static List<CommentStatement> createRpcCallableMethodHeaderComment(
Method method, Optional<String> sampleCode) {
JavaDocComment.Builder methodJavadocBuilder = JavaDocComment.builder();

if (method.hasDescription()) {
Expand All @@ -225,7 +226,9 @@ static List<CommentStatement> createRpcCallableMethodHeaderComment(Method method
}

methodJavadocBuilder.addParagraph(METHOD_DESCRIPTION_SAMPLE_CODE_SUMMARY_STRING);
// TODO(summerji): Add sample code here.
if (sampleCode.isPresent()) {
methodJavadocBuilder.addSampleCode(sampleCode.get());
}

return Arrays.asList(
CommentComposer.AUTO_GENERATED_METHOD_COMMENT,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
package com.google.api.generator.gapic.composer;

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.api.gax.longrunning.OperationFuture;
import com.google.api.generator.engine.ast.AssignmentExpr;
import com.google.api.generator.engine.ast.CommentStatement;
import com.google.api.generator.engine.ast.ConcreteReference;
Expand Down Expand Up @@ -332,6 +333,101 @@ public static String composeRpcDefaultMethodHeaderSampleCode(
.build());
}

public static String composeRpcLroCallableMethodHeaderSampleCode(
Method method,
TypeNode clientType,
Map<String, ResourceName> resourceNames,
Map<String, Message> messageTypes) {
VariableExpr clientVarExpr =
VariableExpr.withVariable(
Variable.builder()
.setName(JavaStyle.toLowerCamelCase(clientType.reference().name()))
.setType(clientType)
.build());
// Assign method's request variable with the default value.
VariableExpr requestVarExpr =
VariableExpr.withVariable(
Variable.builder().setName("request").setType(method.inputType()).build());
Message requestMessage = messageTypes.get(method.inputType().reference().simpleName());
Preconditions.checkNotNull(requestMessage);
Expr requestBuilderExpr =
DefaultValueComposer.createSimpleMessageBuilderExpr(
requestMessage, resourceNames, messageTypes);
List<Expr> bodyExprs = new ArrayList<>();
bodyExprs.add(
AssignmentExpr.builder()
.setVariableExpr(requestVarExpr.toBuilder().setIsDecl(true).build())
.setValueExpr(requestBuilderExpr)
.build());
TypeNode operationFutureType =
TypeNode.withReference(
ConcreteReference.builder()
.setClazz(OperationFuture.class)
.setGenerics(
method.lro().responseType().reference(),
method.lro().metadataType().reference())
.build());
VariableExpr operationFutureVarExpr =
VariableExpr.withVariable(
Variable.builder().setName("future").setType(operationFutureType).build());
MethodInvocationExpr rpcMethodInvocationExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(clientVarExpr)
.setMethodName(
String.format("%sOperationCallable", JavaStyle.toLowerCamelCase(method.name())))
.build();
rpcMethodInvocationExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(rpcMethodInvocationExpr)
.setMethodName("futureCall")
.setArguments(requestVarExpr)
.setReturnType(operationFutureType)
.build();
bodyExprs.add(
AssignmentExpr.builder()
.setVariableExpr(operationFutureVarExpr.toBuilder().setIsDecl(true).build())
.setValueExpr(rpcMethodInvocationExpr)
.build());
List<Statement> bodyStatements =
bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
bodyExprs.clear();
bodyStatements.add(CommentStatement.withComment(LineComment.withComment("Do something;")));
MethodInvocationExpr futureGetMethodExpr =
MethodInvocationExpr.builder()
.setExprReferenceExpr(operationFutureVarExpr)
.setMethodName("get")
.setReturnType(method.lro().responseType())
.build();
boolean returnVoid = isProtoEmptyType(method.lro().responseType());
if (returnVoid) {
bodyExprs.add(futureGetMethodExpr);
} else {
VariableExpr responseVarExpr =
VariableExpr.builder()
.setVariable(
Variable.builder()
.setName("response")
.setType(method.lro().responseType())
.build())
.setIsDecl(true)
.build();
bodyExprs.add(
AssignmentExpr.builder()
.setVariableExpr(responseVarExpr)
.setValueExpr(futureGetMethodExpr)
.build());
}
bodyStatements.addAll(
bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList()));
bodyExprs.clear();
return SampleCodeWriter.write(
TryCatchStatement.builder()
.setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr))
.setTryBody(bodyStatements)
.setIsSampleCode(true)
.build());
}

@VisibleForTesting
static TryCatchStatement composeUnaryRpcMethodSampleCode(
Method method,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -504,7 +504,19 @@ 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();
* OperationFuture<WaitResponse, WaitMetadata> future =
* echoClient.waitOperationCallable().futureCall(request);
* // Do something;
* WaitResponse response = future.get();
* }
* }</pre>
*/
public final OperationCallable<WaitRequest, WaitResponse, WaitMetadata> waitOperationCallable() {
return stub.waitOperationCallable();
}
Expand Down
16 changes: 16 additions & 0 deletions test/integration/goldens/asset/AssetServiceClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,22 @@ 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();
* OperationFuture<ExportAssetsResponse, ExportAssetsRequest> future =
* assetServiceClient.exportAssetsOperationCallable().futureCall(request);
* // Do something;
* ExportAssetsResponse response = future.get();
* }
* }</pre>
*/
public final OperationCallable<ExportAssetsRequest, ExportAssetsResponse, ExportAssetsRequest>
exportAssetsOperationCallable() {
Expand Down
Loading

0 comments on commit abc6879

Please sign in to comment.